2017-01-16 66 views
0

是否有任何性能上的差異使用ObservableCollection,其中(據我所知)刷新查看每次產品加入收藏,或改用簡單的List收集,並刷新的時候就已經添加了所有元素整體看法?List或ObservableCollection?

而且如上甚至可以譴責與List場景?那麼如何實現呢?

我這麼問是因爲我的ItemsControl很慢,我不知道它是否會更好地使用簡單的列表,而不是的ObservableCollection。我需要一次刷新視圖一次,實際上所有元素都已添加到集合中。

回答

1

ObservableCollection<T>工具IList<T>就像List<T>一樣。主要區別當然是它實現了INotifyCollectionChanced,它允許WPF綁定它。

ObservableCollection<T>的拋出每次更改UI後可刷新的事件。如果按順序添加大量項目,可能會對性能產生一些影響,但這不太可能。您可以使用構造至極測試這個簡單的一個List:

var originalList = new List<SomeClass>(); 

foreach ([..]) 
{ 
    originalList.Add(someInstance); 
} 

ObservableCollection<SomeClass> uiCollection = new ObservableCollection<SomeClass>(originalList); 

這種方式,你可以創建你的對象和之後的複雜的列表其完成後,您可以創建一個ObservableCollection了它,你將綁定到上UI。

1

如果您不打算在運行時動態添加或刪除項目,則最好使用List<T>而不是ObservableCollection<T>。雖然性能的差異可以忽略不計。

有關ObservableCollection<T>的特別之處在於,它實現了INotifyCollectionChanged接口:https://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged(v=vs.110).aspx

WPF訂閱了CollectionChanged事件的任何集合實現這個接口來監聽收集相關的改變。因此,如果您出於某種原因想要創建自己的支持更改通知的自定義集合,則可以創建一個實現此接口的類。

我強烈懷疑你的性能問題與你正在使用的源集合類型有關。您應該確保用戶界面已啓用虛擬化和走線槽的建議,關於如何提高在WPF控件的性能以下列表:https://msdn.microsoft.com/en-us/library/cc716879(v=vs.110).aspx