2013-03-06 93 views
2

我想要一個域模型集合類和一個視圖模型類,它只反映和投影域模型的元素 - 但它本身是隻讀的。針對INotifyCollectionChanged類型的數據綁定

我在這裏想到的是,這兩種類型實現INotifyCollectionChanged接口和視圖模型類型,然後只充當一個代理和投影儀,它包裝在元素視圖模型類型的模型元素。

問題是:正在實現INotifyCollectionChanged足以使WPF數據綁定到DataGrid或ListView,或者啓用基於集合的數據綁定所需的最小接口集合是什麼?

回答

4

INotifyCollectionChanged只有當您的集合中的元素添加或刪除後,如果集合中的元素中的屬性發生更改,則不會更新您的UI。

所以如果你很樂意跟蹤整個元素的變化,那麼INotifyCollectionChanged就足夠了,任何進一步的粒度,你需要在你的屬性設置器中實現INotifyPropertyChanged

另一點值得注意的是,如果您使用ObservableCollection來安置您的列表,則已經爲您執行INotifiyCollectionChanged

編輯:

以下是微軟的起飛;

您可以枚舉實現IEnumerable 接口的任何集合。但是,要設置動態綁定,以便集合中的插入或 刪除自動更新UI,則集合必須實現INotifyCollectionChanged接口。這個接口暴露了一個事件,當底層集合發生變化時應該引發這個事件。

WPF提供了ObservableCollection(Of T)類,它是一個內置 實現數據收集暴露出 INotifyCollectionChanged接口。支持綁定屬性

注意,要全力支持 從源對象,對應目標傳輸數據值,每個集合中的對象 還必須 實現INotifyPropertyChanged接口。

實現自己的收藏之前, 考慮使用ObservableCollection(Of T)或現有 集合類之一,如List(Of T)Collection(Of T),並 BindingList(Of T),等等。如果您有高級方案 並且想要實現您自己的集合,請考慮使用IList,其中 提供了一個非泛型對象集合,可以通過索引訪問各個對象,從而獲得最佳性能。

從..

http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections

+2

有趣。無論如何,元素視圖模型是(迄今爲止)不可變的。我看不到在視圖中顯示的視圖模型 - 但後來我實現了IEnumerable,這就實現了。實現最小接口集合的要點只是爲了確保只讀模式。元素數量非常少(<100),所以性能不會成爲問題。 – 2013-03-07 00:27:17