为什么 ICollectionView<T> 没有 .Net 接口?

Nil*_*han 5 wpf .net-4.0 collectionviewsource

为什么没有 .Net 接口ICollectionView<T>?看着ICollectionView它似乎很明显的期待ICollectionView<T>

我错过了什么吗?

pdv*_*ies 3

ICollectionView 仅由 CollectionView 类实现。MSDN文档指出 CollectionView 甚至不应该在代码中实例化,而应该使用 CollectionViewSource 对象来获取集合视图。

如果你想在 CollectionView 中返回你自己的 T 集合,你需要将你自己的集合(实现 IEnumerable)添加到 CollectionViewSource 对象并从那里获取 CollectionView,例如:

    List<MyClass> listToView = new List<MyClass>();
    MyClass x1 = new MyClass() { Name = "Fictive Name 1", Description = "Description...", Date = DateTime.Now};
    MyClass x2 = new MyClass() { Name = "Fictive Name 2", Description = "Description...", Date = DateTime.Now};
    MyClass x3 = new MyClass() { Name = "Fictive Name 3", Description = "Description...", Date = DateTime.Now};
    listToView.Add(x1);
    listToView.Add(x2);
    listToView.Add(x3);

    CollectionViewSource collectionViewSource = new CollectionViewSource();
    collectionViewSource.Source = listToView;
    ICollectionView collectionView = collectionViewSource.View;
Run Code Online (Sandbox Code Playgroud)

T 没有 ICollectionView 的原因可能是因为它不是这样设计的。文档指出 CollectionView 的设计目的是在不更改集合的情况下提供不同的视图

您可以将集合视图视为绑定源集合之上的一层,它允许您基于排序、筛选和组查询来导航和显示集合,而无需操作底层源集合本身。

从这方面来说,您只能查看集合是有道理的,因此名称为“ViewCollection”。

我认为期望 T 的 ICollectionView 并不是那么明显,因为 CollectionView 甚至不应该首先实例化(顺便说一下,在添加一些排序功能后,请参阅下面有趣的警告)。

System.Windows.Data 警告:52:不完全支持直接使用 CollectionView。基本功能可以工作,尽管效率有些低下,但高级功能可能会遇到已知的错误。考虑使用派生类来避免这些问题。

我认为该架构被设计为在基于“只读”的级别上工作,而无需更改其底层数据源,因为这是数据集合的分组、过滤和导航的主要关注点。

但是,如果您想确切知道原因,您可能需要与负责该框架这一部分的 Microsoft 人员交谈。