[英]cast object to List<T>
我有一個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
的值。 這樣,您可以確定實際傳遞的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.