[英]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.