2013-10-03 43 views
0

我有一個MVVM項目一個視圖有一個網格,允許多選,投對象名單<T>

<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投射到我的列表中?

+0

您是否嘗試過使用'((TargetType [])p).ToList();'。請記住,數組是通過這種方式在列表中複製的。 –

+1

數組不是一個列表。 –

+0

@ AlessandroD'Andria號,但我正在嘗試 –

回答

2

您可以使用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(); 
+0

此解決方案會導致無效投射。 –

+0

然後'p'實際上不是'TargetType'的數組。你需要用你的調試/檢查器的一些屏幕截圖來更新你的問題,或者是關於涉及的類和類型的一些具體信息。 – CodingIntrigue

+0

Tks @Rraham你確實是一個SelectedItemCollection,更正是在我的文章中進行的。 –

2

這是因爲DataGrid.SelectedItems is of type IList不是通用IList<T>。 所以你將不得不在IList中

var collection = p as IList 

foreach(var item in collection) 
{ 
    var myitem = (TargetType)item; 
} 
+0

需要幫助。這個答案是可以的。但@Rraham直接投出這個名單,這就是爲什麼我推銷他的解決方案。 –

0

來強制轉換因爲所有你做的是一個foreach在列表上,我建議你轉換爲IEnumerable(或IEnumerable<TargetType>)來代替。使用可能的最簡單的類型/接口是使代碼更加可重用且易於理解的好方法。

如果你遇到了麻煩,因爲鑄造傳遞的類型是不是你認爲它是(這很可能給目前這裏的評論),我建議你把一個斷點上的第一行的方法,並在調試器中檢查p的值。這樣你就可以確定實際傳遞的是什麼。