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

时间:2013-05-13 11:37:22

标签: wpf inotifypropertychanged collectionviewsource inotifycollectionchanged

所以我使用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}}方法视图不再是可观察的。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您应该使用CollectionView类文档的备注部分中列出的方法:

  

要为仅实现IEnumerable的集合创建集合视图,请创建CollectionViewSource对象,将集合添加到Source属性,并从{{获取集合视图1}}属性。

此方法相当于View,即您将使用检索到的CollectionViewSource.GetDefaultView

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