listview selecteditem as T命令参数当事件被Tapped时会给出类型转换异常



我有一个ListView,它绑定到一个集合,即List<InnerGridItems>。问题是,当我尝试将SelectedItem绑定到CommandParameter时,有时它会给出一个typecast异常,说Unable to typecast from Windows。UI。点击EventArgs到InnerGridItems。(WPF和UWP的概念是相同的,有一个Click事件,所以我添加了WPF标记(。请帮忙。

Xaml:

<ListView Margin="0,10,0,0" x:Name="lstInnerItems" Grid.Row="1" 
ItemsSource="{Binding InnerBarCodeItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
SelectionMode="Single"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch"
Tag="{Binding ElementName=ImgFlash}">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Tapped">
<Core:InvokeCommandAction 
Command="{Binding ListSelectionChangedCommand,Mode=OneWay}" 
CommandParameter="{Binding ElementName=lstInnerItems, Path=SelectedItem}"></Core:InvokeCommandAction>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<RadioButton x:Name="rbnEnumerated" GroupName="A" 
IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<Interactivity:Interaction.Behaviors>
<Core:DataTriggerBehavior Binding="{Binding IsVisible, Mode=TwoWay}" Value="False">
<Core:ChangePropertyAction TargetObject="{Binding ElementName=rbnEnumerated}" PropertyName="Visibility" Value="Collapsed" />
</Core:DataTriggerBehavior>
<Core:DataTriggerBehavior Binding="{Binding IsVisible, Mode=TwoWay}" Value="True">
<Core:ChangePropertyAction TargetObject="{Binding ElementName=rbnEnumerated}" PropertyName="Visibility" Value="Visible" />
</Core:DataTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</RadioButton>
<TextBlock Text="{Binding SerialNumber}" Margin="10,0,0,0"></TextBlock>
<TextBlock Margin="14,0,0,0">
<Run Text="("></Run>
<Run Text="{Binding SerialPort}"></Run>
<Run Text=")"></Run>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

这是我的型号

InnerGridItems.cs

public class InnerGridItems : BindableBaseThreadSafe
{
private string _serialNumber = "N/A";
public string SerialNumber
{
get => _serialNumber;
set => Set(ref _serialNumber, value);
}
private string _serialPort = "N/A";
public string SerialPort
{
get => _serialPort;
set => Set(ref _serialPort, value);
}
private bool _isChecked;
public bool IsChecked
{
get => _isChecked;
set => Set(ref _isChecked, value);
}
private MemoryStream _flashedBarCodeImage;
public MemoryStream FlashedBarCodeImage
{
get => _flashedBarCodeImage;
set => Set(ref _flashedBarCodeImage, value);
}
private bool _isVisisble = true;
public bool IsVisible
{
get => _isVisisble;
set => Set(ref _isVisisble, value);
}
}

这是我的ICommand

public ICommand ListSelectionChangedCommand { get; set; }
private void FlashImageForSelectedRow(InnerGridItems obj)
{
//Gives an exception that it cannot type cast to InnerGridItems.
}

如果这是一个间歇性问题,您可以尝试在使用isas运算符/关键字执行转换之前检查转换,或者以其他方式捕获异常。as更好,因为它的投射次数更少(is与讨论中的相比(

使用as:

var items = eventArgs as InnerGridItems;
if(items != null)
{
//do stuff with items!
}
else
{
//do nothing, or whatever you want to handle this condition
}

使用is:

if( eventArgs is InnerGridItems)
{ 
var items = eventArgs as InnerGridItems;
//do stuff with items!
}
else // this could allow you to do multiple is checks.
{
//do nothing, or whatever you want to handle this condition
}

然后,您将更改FlashImageForSelectedRow方法以接受objectEventArgs实例,然后在该方法内部执行as/is检查。

这并不能回答为什么会发生这种情况的更深层次的问题,看起来点击事件有时并没有抓住你的InnerGridItems实例。除非弄清问题的真相对你来说真的很重要(这很酷,请分享你发现的任何东西!(,否则我认为添加一个简单的检查可能就足够了,可以让你把时间花在其他事情上!

最新更新