2013-02-12 25 views
4

我想決定是否要將所有IEnumerable集合切換到Observable集合。我無法找到一個很好的解釋。可理解術語中可觀察收藏的優點和缺點是什麼?通過IEnumerable使用Observable集合的優點和缺點

+0

作爲次要方面的說明:Observables也實現IEnumerable。它們還具有額外的好處,它們可以設置爲由UI進行監視。 – sircodesalot 2013-02-12 17:53:46

+3

已關閉?尊重地不贊成那個投票。正如常見問題解答中所述,這完全在「我希望其他人向我解釋」的範圍內,並確定了OP要求解釋的具體內容。我認爲有幾個很好的,詳細的答案表明「不具有建設性」的封閉是不恰當的。投票重新開放。 – 2013-02-12 18:38:13

+1

謝謝@David W.我自己有點困惑,爲什麼它被關閉.. – JLott 2013-02-12 18:39:19

回答

12

您可能會決定將IEnumerable<Something>作爲某種屬性的類型,但使用ObservableCollection<Something>作爲實際值。

如果你有這樣的特性:

private IEnumerable<Something> collectionOfSomething; 
public IEnumerable<Something> CollectionOfSomething 
{ 
    get { return collectionOfSomething; } 
    set 
    { 
     collectionOfSomething = value; 
     NotifyPropertyChanged("CollectionOfSomething"); 
    } 
} 

現在,你可以簡單地分配給該屬性像

someViewModelObject.CollectionOfSomething = new ObservableCollection<Something>(); 

當您分配或綁定到一個集合屬性(例如ItemsControl.ItemsSource),目標對象通常會檢查實際屬性值是否實現INotifyCollectionChanged(什麼ObservableCollection)並附加CollectionChanged處理程序以獲取有關源集合中更改的通知。

如果您以後決定採用其他更智能的INotifyCollectionChanged實現,則不需要更改所有屬性類型。只是一些替代像觀察集合的這

someViewModelObject.CollectionOfSomething = new MyVerySmartCollection<Something>(); 
+1

+1用於顯示NotifyPropertyChanged實現:) – 2013-02-12 17:12:24

+0

嗯,這實際上真的很有幫助..我可能會攪亂它一段時間。它可以解決我使用IEnumerable時遇到的問題。謝謝!\ – JLott 2013-02-12 17:15:18

3

我可能會這樣構思你的問題的答案:當你的收藏改變內容時,你的應用程序是否需要通知?如果是這樣,那麼這樣的改變可能是有保證的。我的理解是Observable集合的首要特徵是它們在集合更改時提供通知機制,而IEnumerable僅提供單迭代枚舉器。

我希望有幫助。

1

整點的分配(S)是他們實現以下接口

INotifyCollectionChanged, INotifyPropertyChanged 

這使得它非常容易提醒UI /的視圖模型相應地更改和更新。如果您沒有使用ObservableCollection,則需要手動實施對集合/屬性的更新。

2

使用ObservableCollection的最大好處是自動實現INotifyCollectionChanged和INotifyPropertyChanged,這使得數據綁定更簡單。我會說,當你第一次設置你的數據綁定時最好使用ObservableCollection。

但是現在你已經編碼了(和數據綁定?)一堆IEnumerables,在這一點上沒有任何節省。

另一個要考慮的是,ObservableCollection<T>IEnumerable(從Collection<T>繼承)。由於IEnumerable是一個接口,它是由很多類實現的List<T>就是這樣一個類 - ObservableCollection<T>是另一個類。

+1

我喜歡@Clemens示例,它在代碼中顯示了就數據綁定而言的差異。因此,也許所有未來的項目增加可以從'ObservableCollecion ' – EtherDragon 2013-02-12 17:12:59

+0

受益'我還沒有限制他們呢...我有問題,因爲我不得不使用另一個視圖的值,我在工作中看不到那些數據。我聽說將其更改爲可觀察的集合可以修復它,但我仍然不完全確定。這是導致此問題的我的上一個問題的鏈接... http://stackoverflow.com/questions/14836678/連接數據在二級用於在視圖/ 14836935#comment20791174_14836935 – JLott 2013-02-12 17:13:40

+0

@JLott編輯新信息的答案 – EtherDragon 2013-02-12 17:21:54