5

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

我错过了什么吗?

4

1 回答 1

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;

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

您可以将集合视图视为绑定源集合之上的一个层,它允许您基于排序、过滤和分组查询来导航和显示集合,所有这些都无需操作底层源集合本身。

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

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

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

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

但是,如果您想确切地知道原因,您可能必须与从事该框架这部分工作的 Microsoft 人员交谈。

于 2012-10-21T13:27:03.713 回答