使用ObservableCollection
的性能是否有任何差异,(我的理解)每次添加到集合时刷新视图,或者使用简单的List
集合,并在所有元素时刷新整个视图已添加?
即使可能,List
如上所述的情况也是如此?那么如何实现呢?
我问因为我的ItemsControl很慢,我想知道使用简单的List而不是ObservableCollection会更好。我需要一次刷新一次视图,而实际上所有元素都已添加到集合中。
答案 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上绑定到它。