我有代表ListViewItem
名为ItemViewModel
的模型的类。 ItemViewModel
包含object类型的属性Item。
接下来,我有一个名为ListViewModel
的类,其属性为ItemCollection<ItemViewModel>
。现在我想通过属性作为Item属性的属性在ItemCollection
中对值进行排序。
在这种情况下,最佳演员表演是什么? 我可以这样做:
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的一部分。
答案 0 :(得分:0)
您正在使用ICollection<T>
的{{1}}界面进行操作。但ItemCollection<T>
能够保持其传入的原始数据的状态。
您想要的是将ItemCollection<T>
设置为一个或多个排序条件。例如
SortDescriptions
但请记住,您的方法并不完全符合MVVM,因为ItemCollection.SortDescriptions.Add(
new SortDescription("Title", ListSortDirection.Ascending));
和ItemCollection<T>
是WPF框架的一部分,因此它们是&#34; View&#的一部分34 ;.
过滤条件更改时应通知视图并适当更新内容。
更新:此外,如果您使用CollectionView<T>
绑定到列表,则在添加或删除新项目时,列表将自动使用/重新分组。
更新2:
另一种更符合MVVM的方法是使用可以在XAML中绑定和使用的ObservableCollection<T>
(MSDN Link)。如果您的排序/分组是静态的并且您不需要在运行时更改它,则此方法可以正常工作。
取自WPF Tutorial的示例。
CollectionViewSource
<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
来完成它,但这超出了此答案的范围。