2011-06-11 59 views

回答

106

總是綁定到ICollectionView,不管你讓它明示或沒有。

假設我們有

var collection = new ObservableCollection<string>(); 
var collectionView = CollectionViewSource.GetDefaultView(collection); 

在這種情況下,結合於collectioncollectionView是同一個:綁定引擎將結合到默認集合視圖(其是參考等於collectionView)如果你告訴它綁定到collection

這意味着你的問題的答案是「它絕對沒有區別」。

說得很清楚:即使您直接綁定到集合,綁定引擎也會綁定到默認視圖。修改視圖的屬性(如排序條件)將會影響看起來直接綁定到集合的綁定,因爲它是隱藏的,它是對默認視圖的綁定。

但是,還有另一個有趣和相關的問題:如果綁定到默認集合視圖(即集合本身,因爲沒有理由顯式綁定到默認視圖)或集合的另一個視圖?考慮到每個視圖都有它自己的當前項目,排序標準等概念,那麼如果你打算對同一個集合有多個綁定,並且綁定控件需要對當前項目有不同的概念,那麼過濾器和公司,那麼你想要的是顯式綁定到相同的基礎集合的多個視圖。

+0

太棒了。我自己的偏好是綁定到ObservableCollection,現在它是System.Collections的一部分,並且「感覺」更具代表性,我相對於View來說代表了關於Model的某些內容,但是MVVM有時候很容易就會很敏感。 – Berryl 2011-06-11 23:09:13

+0

輸出答案。我只想指出,在Silverlight中,除非綁定集合實現了ICollectionViewFactory,否則將不會爲綁定集合創建默認CollectionView。 – jspaey 2012-08-30 11:50:59

+0

這是否也適用於Universal應用程序? – 2014-11-26 20:27:29

3

如果希望網格顯示應用於視圖的設置,則可以綁定到視圖。過濾,否則視圖是多餘的。

27

ObservableCollection<T> Implemented INotifyCollectionChanged並且當集合中的項目已被更改時將通知UI。

ICollectionView除了傳播INotifyCollectionChanged事件(如果底層集合實現它)之外,還允許您對集合進行過濾,排序或分組。

只要你綁定到MVVM,任何一種類型都可以很好地工作。當您需要排序,過濾或分組時,請使用ICollectionView。如果沒有,則直接使用ObservableCollection<T>

7

我不這麼認爲它必須做任何事情與MVVM本身。 ICollectionView提供像soring分組和等附加功能,如果你需要那些使用IColectionView否則簡單地使用ObservableCollection

9

只是爲了增加Jon的話。主要的區別是,通過使用CollectionViewSource.GetDefaultView(collection),你讓ViewModel依賴於WPF。許多MVVM純粹主義者不喜歡這樣,這會讓ObservableCollection只有有效的選項。

其他選項將使用ICollectionView並使用一個類來實現它,但不是WPF本身的一部分。

+1

雖然這不是主要區別。請注意wpf標籤。 「[如果]綁定控件需要對當前項目,過濾器和公司有不同的概念,那麼你想要的是顯式綁定到相同底層集合的多個視圖。」這是不同的。作爲一個「純粹主義者」,不管是什麼,都意味着你不能過濾等等。請參閱Jimmie Houts的回答,它側重於清晰語言的實際區別。 – 2014-07-08 00:59:15

相關問題