List或ObservableCollection?

时间:2017-01-16 15:46:07

标签: wpf xaml observablecollection

使用ObservableCollection的性能是否有任何差异,(我的理解)每次添加到集合时刷新视图,或者使用简单的List集合,并在所有元素时刷新整个视图已添加?

即使可能,List如上所述的情况也是如此?那么如何实现呢?

我问因为我的ItemsControl很慢,我想知道使用简单的List而不是ObservableCollection会更好。我需要一次刷新一次视图,而实际上所有元素都已添加到集合中。

2 个答案:

答案 0 :(得分:2)

如果您不打算在运行时动态添加或删除项目,也可以使用List<T>而不是ObservableCollection<T>。但性能差异可以忽略不计。

关于ObservableCollection<T>的特殊之处在于它实现了INotifyCollectionChanged界面:https://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged(v=vs.110).aspx

WPF订阅实现此接口的任何集合的CollectionChanged事件,以侦听集合更改。因此,如果您出于某种原因想要创建自己的支持更改通知的自定义集合,则可以创建一个实现此接口的类。

我强烈怀疑您的性能问题与您使用的源集合类型有关。您应该确保启用了UI虚拟化,并通过以下关于如何提高WPF中控件性能的建议列表:https://msdn.microsoft.com/en-us/library/cc716879(v=vs.110).aspx

答案 1 :(得分:2)

IList<T>List<T>一样实现INotifyCollectionChanged。主要区别当然是它实现了ObservableCollection<T>,它允许WPF绑定到它。

每次更改后var originalList = new List<SomeClass>(); foreach ([..]) { originalList.Add(someInstance); } ObservableCollection<SomeClass> uiCollection = new ObservableCollection<SomeClass>(originalList); 都会抛出一个事件,因此UI可以刷新。如果您按顺序添加大量项目,它可能会对您的性能产​​生一些影响,但这不太可能。您可以使用带有List的构造函数来测试这个:

Sub RestoreOrder()
    Dim N As Long, i As Long
    N = Sheets.Count
    For i = 1 To N
        Sheets("Sheet" & i).Move after:=Sheets(N)
    Next i
End Sub

通过这种方式,您可以创建复杂的对象列表,完成后可以创建一个ObservableCollection,它将在UI上绑定到它。