所以我使用 WPF
作为框架以 MVVM
的方式使用 Caliburn.Micro
。
我有一个带有 ObservableCollection 的 ViewModel,我需要用不同的排序、过滤和分组显示两次。
这个看似简单的 Action 让我有点受不了。我通常会这样做:
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;
}
}
它工作正常,它排序并且它是可观察的。
所以我以同样的方式添加了第二个 View :
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;
}
}
现在的问题是(可能是因为我访问了默认 View 并因此具有相同的引用)所有排序/过滤都对两个 View 完成。
所以我试图做
ICollectionView
的新实例,但不应该使用 CollectionView
并且 ListCollectionView
是为列表而不是 IEnumarbles
制作的,所以即使我使用 ToList()
方法, View 也不再是可观察的。这样做的正确方法是什么?
最佳答案
您应该使用 CollectionView
类文档的备注部分中概述的方法:
这种方法等效于 CollectionViewSource.GetDefaultView
,即您将使用检索到的 View
完全相同:
关于wpf - Observable 绑定(bind)到同一集合的两个 ICollectionView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16521094/