[英]Property casting in linq expression
我有一個類表示ListViewItem
模型,名為ItemViewModel
。 ItemViewModel
包含對象類型的屬性Item。
接下來,我有一個名為ListViewModel
類,其屬性為ItemCollection<ItemViewModel>
。 現在,我想按一些屬性對ItemCollection
的值進行排序,這些屬性是Item屬性的屬性。
在這種情況下,最佳的演員陣容是什么? 我可以做這個:
ItemCollection= ItemCollection.OrderBy((lvItem) => SongModel(lvItem.Item).Title).ToArray());
但我認為必須有更好的解決方案。
public class ItemViewModel : INotifyPropertyChanged
{
bool isSelected;
public bool IsSelected
{
get
{
return isSelected;
}
set
{
if (value != IsSelected)
{
isSelected = value;
RaisePropertyChanged("IsSelected");
}
}
}
object item;
public event PropertyChangedEventHandler PropertyChanged;
public object Item
{
get
{
return item;
}
set
{
item = value;
RaisePropertyChanged("Item");
}
}
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
¨ 更新:對您的誤會感到抱歉。 ItemCollection僅是我的收藏的名稱。 實際上以我為例。 ItemCollection是ObserverableCollection的類型,因此我的ItemCollection沒有類似ItemCollection.SortDescriptions的任何屬性。 ItemCollection綁定到ListView,這是我的View的一部分。
您正在ItemCollection<T>
的ICollection<T>
接口上進行操作。 但是ItemCollection<T>
能夠維護傳入數據的自身狀態。
您需要將SortDescriptions
設置為一個或多個排序條件。 例如
ItemCollection.SortDescriptions.Add(
new SortDescription("Title", ListSortDirection.Ascending));
但是請記住,您的方法並不完全符合MVVM,因為ItemCollection<T>
和CollectionView<T>
是WPF框架的一部分,因此它們是“視圖”的一部分。
篩選條件更改並適當更新內容時,應通知該視圖。
更新 :同樣,如果您使用ObservableCollection<T>
綁定到列表,則在添加或刪除新項目時將自動對列表進行重新排序/重新組合。
更新2:
另一種更兼容MVVM的方法是使用CollectionViewSource
( MSDN鏈接 ),它可以在XAML中綁定和使用。 如果您的排序/分組是靜態的,並且您不需要在運行時更改它,則此方法很好。
示例取自WPF教程 。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<CollectionViewSource Source="{Binding}" x:Key="customerView">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Country" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<ListBox ItemSource="{Binding Source={StaticResource customerView}}" />
</Window>
CollectionViewSource
的Source將是您可觀察的集合。
如果需要動態/運行時確定排序參數,則可能需要做更多工作。 您可能必須使用附加行為或IValueConverter
才能完成此操作,但這超出了此答案的范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.