為 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》