如果一個結合DataGrid
到我應該結合ICollectionView或的ObservableCollection
ICollectionView = CollectionViewSource.GetDefaultView(collection)
或到
ObservableCollection<T> collection;
???
MVVM的最佳實踐是什麼?爲什麼?
如果一個結合DataGrid
到我應該結合ICollectionView或的ObservableCollection
ICollectionView = CollectionViewSource.GetDefaultView(collection)
或到
ObservableCollection<T> collection;
???
MVVM的最佳實踐是什麼?爲什麼?
您總是綁定到ICollectionView
,不管你讓它明示或沒有。
假設我們有
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
在這種情況下,結合於collection
或collectionView
是同一個:綁定引擎將結合到默認集合視圖(其是參考等於collectionView
)如果你告訴它綁定到collection
。
這意味着你的問題的答案是「它絕對沒有區別」。
說得很清楚:即使您直接綁定到集合,綁定引擎也會綁定到默認視圖。修改視圖的屬性(如排序條件)將會影響看起來直接綁定到集合的綁定,因爲它是隱藏的,它是對默認視圖的綁定。
但是,還有另一個有趣和相關的問題:如果綁定到默認集合視圖(即集合本身,因爲沒有理由顯式綁定到默認視圖)或集合的另一個視圖?考慮到每個視圖都有它自己的當前項目,排序標準等概念,那麼如果你打算對同一個集合有多個綁定,並且綁定控件需要對當前項目有不同的概念,那麼過濾器和公司,那麼你想要的是顯式綁定到相同的基礎集合的多個視圖。
如果希望網格顯示應用於視圖的設置,則可以綁定到視圖。過濾,否則視圖是多餘的。
ObservableCollection<T>
Implemented INotifyCollectionChanged
並且當集合中的項目已被更改時將通知UI。
ICollectionView
除了傳播INotifyCollectionChanged
事件(如果底層集合實現它)之外,還允許您對集合進行過濾,排序或分組。
只要你綁定到MVVM,任何一種類型都可以很好地工作。當您需要排序,過濾或分組時,請使用ICollectionView
。如果沒有,則直接使用ObservableCollection<T>
。
我不這麼認爲它必須做任何事情與MVVM
本身。 ICollectionView
提供像soring分組和等附加功能,如果你需要那些使用IColectionView
否則簡單地使用ObservableCollection
只是爲了增加Jon的話。主要的區別是,通過使用CollectionViewSource.GetDefaultView(collection)
,你讓ViewModel依賴於WPF。許多MVVM純粹主義者不喜歡這樣,這會讓ObservableCollection只有有效的選項。
其他選項將使用ICollectionView
並使用一個類來實現它,但不是WPF本身的一部分。
雖然這不是主要區別。請注意wpf標籤。 「[如果]綁定控件需要對當前項目,過濾器和公司有不同的概念,那麼你想要的是顯式綁定到相同底層集合的多個視圖。」這是不同的。作爲一個「純粹主義者」,不管是什麼,都意味着你不能過濾等等。請參閱Jimmie Houts的回答,它側重於清晰語言的實際區別。 – 2014-07-08 00:59:15
太棒了。我自己的偏好是綁定到ObservableCollection,現在它是System.Collections的一部分,並且「感覺」更具代表性,我相對於View來說代表了關於Model的某些內容,但是MVVM有時候很容易就會很敏感。 – Berryl 2011-06-11 23:09:13
輸出答案。我只想指出,在Silverlight中,除非綁定集合實現了ICollectionViewFactory,否則將不會爲綁定集合創建默認CollectionView。 – jspaey 2012-08-30 11:50:59
這是否也適用於Universal應用程序? – 2014-11-26 20:27:29