linq 表达式中的属性强制转换
本文关键字:转换 属性 表达式 linq | 更新日期: 2023-09-27 18:33:33
我有代表ListViewItem
模型的类,名为ItemViewModel
。 ItemViewModel
包含对象类型的属性项。
接下来,我有一个名为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,它是 My 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 的方法是使用可在 XAML 中绑定和使用的CollectionViewSource
(MSDN 链接(。如果您的排序/分组是静态的,并且您不需要在运行时更改它,则此方法可以正常工作。
示例取自 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
的来源将是您的可观察集合。
如果您需要动态/运行时确定排序参数,则可能需要更多工作。您可能必须使用附加行为或IValueConverter
来完成它,但这超出了本答案的范围。