可观察绑定到两个ICollectionView的同一集合

可观察绑定到两个ICollectionView的同一集合

问题描述:

所以我使用WPFMVVM的方式使用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()方法的意见是不再观察到。

什么是正确的方法来做到这一点?

+1

您是否尝试过按照'CollectionView'类的文档备注中所述的建议? *若要为仅实现“IEnumerable”的集合创建集合视图,请创建一个“CollectionViewSource”对象,将集合添加到Source属性,并从View属性获取集合视图。* – 2013-05-13 11:45:37

+0

@DanielHilgarth Absolutely ,但你的答案指出我在那里犯的错误,我直接绑定到CollectionViewSource而不是它的View属性,这很好。也许你不想提交这个答案?当你这样做时,你是否使用CollectionViewSource或它的View属性进行排序。过滤器似乎必须直接应用于View属性。 – 2013-05-13 11:58:14

您应该使用在CollectionView类的文档的备注部分介绍的方法:

要创建一个集合,它仅实现IEnumerable集合视图中创建一个CollectionViewSource对象,你的收藏添加到Source属性,并从View属性获取收集视图。

这种做法等同于CollectionViewSource.GetDefaultView,即你将使用检索View一样的:

  • 将其绑定到UI
  • 你用它来过滤
  • 您使用它来排序