所以我使用 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 完全相同:

  • 你将它绑定(bind)到 UI
  • 你用它来过滤
  • 你用它来排序
  • 关于wpf - Observable 绑定(bind)到同一集合的两个 ICollectionView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16521094/

    10-12 12:37
    查看更多