所以我使用WPF
方式MVVM
使用Caliburn.Micro
作为框架。
我有一个带有ObservableCollection的ViewModel,我需要通过不同的排序,过滤和分组来显示两次。
我对这个假设很简单的行动很难过。我通常会这样做:
private ICollectionView _datagridCollectionView;
public ICollectionView DatagridCollectionView
{
get
{
if (this._datagridCollectionView == null)
{
this._datagridCollectionView = CollectionViewSource.GetDefaultView(this.Items);
using (this._datagridCollectionView.DeferRefresh())
{
this._datagridCollectionView.SortDescriptions.Clear();
this._datagridCollectionView.SortDescriptions.Add(new SortDescription("SortingProperty", ListSortDirection.Ascending));
}
}
return this._datagridCollectionView;
}
}
它工作正常,它排序并且可以观察到。
所以我以同样的方式添加了第二个视图:
private ICollectionView _chartCollectionView;
public ICollectionView ChartCollectionView
{
get
{
if (this._chartCollectionView == null)
{
this._chartCollectionView = CollectionViewSource.GetDefaultView(this.Items);
using (this._chartCollectionView.DeferRefresh())
{
this._chartCollectionView.Filter = (p) => { return p.IsChartable; };
}
}
return this._chartCollectionView;
}
}
现在问题是(可能因为我访问默认视图,因此具有相同的引用),所有排序/过滤都对两个视图都进行了。
所以我尝试使用ICollectionView
的新实例,但不应使用CollectionView
并且ListCollectionView
用于列表,而不是IEnumarbles
所以即使我使用了ToList()
{{1}}方法视图不再是可观察的。
这样做的正确方法是什么?
答案 0 :(得分:2)
您应该使用CollectionView
类文档的备注部分中列出的方法:
要为仅实现
IEnumerable
的集合创建集合视图,请创建CollectionViewSource
对象,将集合添加到Source
属性,并从{{获取集合视图1}}属性。
此方法相当于View
,即您将使用检索到的CollectionViewSource.GetDefaultView
: