将对象强制转换为列表
本文关键字:列表 转换 对象 | 更新日期: 2023-09-27 18:33:40
我有一个MVVM项目,一个视图有一个允许多选的网格,
<DataGrid x:Name="DataGridBodegas" ItemsSource="{Binding MyLis}" Grid.Row="1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding _MyCommand}" CommandParameter="{Binding ElementName=DataGridBodegas,Path=SelectedItems}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
<DataGridTextColumn Header="{x:Static resources:Labels.ACOPIO_SeleccioneBodegas}" Width="Auto" Binding="{Binding StrNombreBodega}" ClipboardContentBinding="{x:Null}"/>
</DataGrid.Columns>
</DataGrid>
在VM,我有一个ICommand
public override void CommandSelectionChange(object p)
{
MyList.RemoveAll(x=> x.IntIdBodega != -1);
MyList = p as List<Merlin_INV_Bodegas>; // Allways return Null
}
如果我看一下p object
它是一个具有我的目标类型元素的SelectedItemCollection
,但如果尝试投射如下
(List<TargetType>)p // Throw exception
p as List<TargetType> // Allways return null
foreach( TargetType t in p)
{
} // Throw exception
我的问题是如何将 p 正确投射到我的列表中?
您可以使用 Linq ToList()
List<TargetType> list = ((TargetType[])p).ToList();
或者使用 List<>
构造函数:
List<TargetType> list = new List<TargetType>((TargetType[])p);
如果是SelectedItemCollection
,则需要先将其转换为 IList:
List<TargetType> list = ((System.Collections.IList)p).Cast<TargetType>().ToList();
这是因为
DataGrid.SelectedItems is of type IList
不是通用IList<T>
。所以你将不得不在 IList 中进行类型转换
var collection = p as IList
foreach( var item in collection)
{
var myitem = (TargetType)item;
}
由于您所做的只是对列表的foreach
,因此我建议您改为IEnumerable
(或IEnumerable<TargetType>
)。尽可能使用最简单的类型/接口是使代码更易于重用和理解的好方法。
如果由于传递的类型不是您认为的那样而无法进行转换(鉴于到目前为止的注释,这似乎可能),我建议您在方法的第一行放置断点,并在调试器中检查p
的值。这样,您就可以确定实际传递的内容。