可观察绑定到两个ICollectionView的同一集合
问题描述:
所以我使用WPF
以MVVM
的方式使用Caliburn.Micro
作为框架。可观察绑定到两个ICollectionView的同一集合
我有一个ViewModel与ObservableCollection,我需要显示两次不同的排序,过滤和分组。
我很难过这种所谓的简单行动。我通常会这样做:
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()
方法的意见是不再观察到。
什么是正确的方法来做到这一点?
答
您应该使用在CollectionView
类的文档的备注部分介绍的方法:
要创建一个集合,它仅实现
IEnumerable
集合视图中创建一个CollectionViewSource
对象,你的收藏添加到Source
属性,并从View
属性获取收集视图。
这种做法等同于CollectionViewSource.GetDefaultView
,即你将使用检索View
一样的:
- 将其绑定到UI
- 你用它来过滤
- 您使用它来排序
您是否尝试过按照'CollectionView'类的文档备注中所述的建议? *若要为仅实现“IEnumerable”的集合创建集合视图,请创建一个“CollectionViewSource”对象,将集合添加到Source属性,并从View属性获取集合视图。* – 2013-05-13 11:45:37
@DanielHilgarth Absolutely ,但你的答案指出我在那里犯的错误,我直接绑定到CollectionViewSource而不是它的View属性,这很好。也许你不想提交这个答案?当你这样做时,你是否使用CollectionViewSource或它的View属性进行排序。过滤器似乎必须直接应用于View属性。 – 2013-05-13 11:58:14