【问题标题】:Why should I avoid instantiating a CollectionView directly?为什么要避免直接实例化 CollectionView?
【发布时间】:2018-10-30 14:35:40
【问题描述】:

documentation of the CollectionView class 说:

您不应在代码中创建此类的对象。要为仅实现 IEnumerable 的集合创建集合视图,请创建一个 CollectionViewSource 对象,将您的集合添加到 Source 属性,然后从 View 属性获取集合视图。

换句话说,我应该写:

var cvs = new CollectionViewSource();
cvs.Source = myData.Where(d => someCondition(d));
var view = cvs.View;

而不是

var view = new CollectionView(myData.Where(d => someCondition(d));

但是,文档未能解释为什么我应该这样做。这两个选项似乎都有效。

如果我选择选项 2 而不是选项 1,会发生什么坏事?

【问题讨论】:

    标签: c# wpf data-binding collectionviewsource


    【解决方案1】:

    CollectionView 类有一些特化,例如ListCollectionView。每当您绑定到某个集合时,都会根据源集合的类型自动为您生成一个视图。您可以使用静态 CollectionViewSource.GetDefaultView 方法获取集合的默认视图,而不是显式创建 CollectionViewCollectionViewSource

    ICollectionView view = CollectionViewSource.GetDefaultView(myData);
    

    如果myData 实现IList,它将返回ListCollectionView

    如果您在视图模型中执行过滤或排序,那么从视图模型中公开ICollectionView 是非常好的。 CollectionViewSource 主要用于在视图中对源集合进行过滤、排序或分组时使用。

    【讨论】:

      【解决方案2】:

      如果您想更改数据的显示方式,绑定 CollectionView 可能会出现问题。

      来自 CollectionViewSource 文档:

      因为一个视图不会改变底层的源集合,一个源集合可以有多个与之关联的视图。通过使用视图,您可以以不同的方式显示相同的数据。例如,您可以使用 Task 对象集合上的两个视图来显示在页面的一个部分按优先级排序并在页面的另一部分按区域分组的任务。

      直接绑定到单个 CollectionView 会限制您显示数据的方式。简而言之,在绑定时,CollectionViewSource 可以更好地处理 XAML 中的集合。

      【讨论】:

      • "直接绑定到单个 CollectionView 会限制您显示数据的方式。"什么会阻止人们围绕同一个集合创建多个 CollectionView?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多