3

所以我正在使用作为框架WPFMVVM方式。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;
    }
}

现在的问题是(可能是因为我访问默认视图并因此具有相同的引用)所有排序/过滤都是对两个视图进行的。

所以我尝试做新的实例,ICollectionViewCollectionView不应该被使用,并且ListCollectionView是为列表制作的,IEnumarbles所以即使我使用ToList()视图不再可观察的方法,我也不会这样做。

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

4

1 回答 1

2

You should use the approach outlined in the remarks section of the documentation of the CollectionView class:

To create a collection view for a collection that only implements IEnumerable, create a CollectionViewSource object, add your collection to the Source property, and get the collection view from the View property.

This approach is the equivalent to CollectionViewSource.GetDefaultView, i.e. you will use the retrieved View just the same:

  • You bind it to the UI
  • You use it to filter
  • You use it to sort
于 2013-05-13T12:02:48.113 回答