WPF 中 ICollectionView 及 ItemsControl 相关的重点
为 OEA 框架 做 WPF 树型表格控件时,浪费了许多时间在一些知识点上,所以写了这篇博客总结一下,和各位博友分享。
ICollectionView 接口的简易使用方法
- 它的 SortDescriptions、GroupDescription 等属性会影响视图的结构,一般情况下会自动刷新。
- 也可以直接使用 Refresh 方法来命令视图的刷新(内部实现一般为重建内部视图模型集合)。
- 如果是批量操作,也可以使用 RefreshDefer 方法来抑制多次刷新,待多个更新操作后再统一刷新。
CollectionView 相关知识点
实现它的类是 CollectionView,而这个类的最主要的两个子类是 ListCollectionView、BindingListCollectionView。这两个类的主要区别如下:
- ListCollectionView 一般用于数据列表是 IList 而不是 IBindingList 的集合的情况。由于视图集合无法监听底层数据列表的变更,所以数据列表变更后,需要手动进行刷新操作。也正是由于它与底层数据列表的关系不大,使得它的 Sort 操作是直接实现在此类中,可以简单地直接使用。
- 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 类的对象。
目前就总结这些吧,以后有了再添加上来。
发现一篇不错的文章:《ItemsControl: A to Z》