0

我有一个 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 objectIt is a SelectedItemCollectionthat has elements of my target type, 但如果我尝试这样转换

(List<TargetType>)p // Throw exception 
p as List<TargetType> // Allways return null 

foreach( TargetType t in p)
{
} // Throw exception 

我的问题是如何将p正确地投射到我的列表中?

4

3 回答 3

4

您可以使用 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();
于 2013-10-03T11:47:57.510 回答
2

这是因为DataGrid.SelectedItems is of type IList不通用IList<T>。所以你必须在 IList 中进行类型转换

var collection = p as IList  

foreach( var item in collection)
{
    var myitem = (TargetType)item;
} 
于 2013-10-03T11:50:57.130 回答
0

由于您所做的只是foreach超出列表,因此我建议您改为使用IEnumerable(or IEnumerable<TargetType>) 。尽可能使用最简单的类型/接口是使代码更可重用和更易于理解的好方法。

如果您因为传递的类型不是您认为的类型而在转换时遇到问题(到目前为止,这里的评论似乎很可能),我建议您在方法的第一行放置一个断点,并检查p调试器中的值。这样您就可以确定实际传递的是什么。

于 2013-10-03T12:04:48.083 回答