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

时间:2012-10-18 00:16:59

标签: wpf .net-4.0 collectionviewsource

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

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

如果你想在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;

没有IC的ICollectionView的原因可能是因为它没有这样设计。 documentation指出CollectionView旨在为集合提供不同的视图而不更改它:

  

您可以将集合视图视为绑定顶部的图层   源集合,允许您导航和显示   基于排序,过滤和组查询的集合,都没有   必须操纵底层的源集合本身。

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

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

  

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

我认为该架构设计为基于“只读”级别而不改变其基础数据源,因为这是分组,过滤和导航数据集合主要关注的内容。

但是,如果您想确切知道原因,那么您可能不得不与Microsoft的某个人讨论这个框架的这一部分。