WPF 中 ICollectionView 及 ItemsControl 相关的重点

  1. 云栖社区>
  2. 博客>
  3. 正文

WPF 中 ICollectionView 及 ItemsControl 相关的重点

文艺小青年 2017-11-30 21:08:00 浏览950 评论0

摘要: 为 OEA 框架 做 WPF 树型表格控件时,浪费了许多时间在一些知识点上,所以写了这篇博客总结一下,和各位博友分享。   ICollectionView 接口的简易使用方法   它的 SortDescriptions、GroupDescription 等属性会影响视图的结构,一般情况下会自动刷新。

为 OEA 框架 做 WPF 树型表格控件时,浪费了许多时间在一些知识点上,所以写了这篇博客总结一下,和各位博友分享。

 

ICollectionView 接口的简易使用方法


 

  1. 它的 SortDescriptions、GroupDescription 等属性会影响视图的结构,一般情况下会自动刷新。
  2. 也可以直接使用 Refresh 方法来命令视图的刷新(内部实现一般为重建内部视图模型集合)。
  3. 如果是批量操作,也可以使用 RefreshDefer 方法来抑制多次刷新,待多个更新操作后再统一刷新。

 

CollectionView 相关知识点


 

    实现它的类是 CollectionView,而这个类的最主要的两个子类是 ListCollectionView、BindingListCollectionView。这两个类的主要区别如下:

  1. ListCollectionView 一般用于数据列表是 IList 而不是 IBindingList 的集合的情况。由于视图集合无法监听底层数据列表的变更,所以数据列表变更后,需要手动进行刷新操作。也正是由于它与底层数据列表的关系不大,使得它的 Sort 操作是直接实现在此类中,可以简单地直接使用。
  2. BindingListCollectionView 用于 IBindingList 作为底层数据列表的情况。它可以监听数据列表的变更,自动进行刷新。但是它的 Sort、过滤 操作与底层数据相关。(见 MSDN:This is because BindingListCollectionView objects use the underlying IBindingList for sorting and filtering functionalities. 来自:BindingListCollectionView 类

    CollectionView 的创建一般使用 CollectionViewSource.GetDefaultView 方法,这一点是 WPF 中的默认机制。但是我们也可以直接使用构造函数来进行创建,例如,我们要为 IBindingList 列表构建 ListCollectionView 时,我们可以直接使用 new ListCollectionView(IList) 构造函数。当在 XAML 中进行类似的特殊构造时,我们则可以使用 CollectionViewSource 标签,并设置它的 CollectionViewType 属性。


 

ItemsControl 相关知识点


    ItemsControl 是 WPF 中最重要的集合控件基类,目前我见到的集合控件都是从这个类继承下来的。当然,这也是 WPF 控件设计规约之一。

    它的使用方法简单地说有两种:一种是使用 ItemsSource + ItemTemplate 来进行数据绑定;一种是直接使用 Items 属性来添加或者删除元素,这种使用方法和在 WinForm 下的使用方案比较类似,所以比较简单。

 

    ItemsControl.Items 属性

    ItemsControl 中的属性 Items 是 ItemCollection 类型,而它是继承自 CollectionView!!!也就是说,Items 其实是 ItemsSource 属性的视图集合类,我们可以通过这个属性来设置 ItemsControl 中集合的显示方案(Filter、Sorting、Grouping、Current)。

    ItemsCollection 对接口的所有实现基本上都是基于内部的 CollectionView 来实现的,它存储在 private ICollectionView _collectionView 这个字段中。当 ItemsSource 存在时,_collectionView 字段是 CollectionViewSource.GetDefaultView 来为 ItemsSource 找到它所对应的 CollectionView 对象。而当我们没有设置 ItemsSource 属性而是直接使用 Items 属性集合时,ItemsCollection 则会生成一个 InnerItemCollectionView 类的对象。

    目前就总结这些吧,以后有了再添加上来。


本文转自BloodyAngel博客园博客,原文链接:http://www.cnblogs.com/zgynhqf/archive/2011/11/19/2255450.html,如需转载请自行联系原作者

【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用立即开通购买,限量从速!  详情请点击

网友评论