列表还是可观察集合?

3
是否使用ObservableCollection和使用简单的List集合有性能差异,前者在每次添加元素时都会刷新视图,而后者在所有元素添加完毕后才会刷新整个视图?
那么使用如上所述的List的方案是否可行?如何实现?
我提出这个问题是因为我的ItemsControl速度很慢,我想知道是否使用简单的List代替ObservableCollection会更好。我只需要在所有元素添加到集合中时一次性刷新视图。
2个回答

5

ObservableCollection<T>实现了与List<T>一样的IList<T>。它们之间的主要区别是,ObservableCollection<T>实现了INotifyCollectionChanged,这使得WPF可以绑定到它上面。

每次更改ObservableCollection<T>都会抛出一个事件,以便UI刷新。如果您有大量顺序添加项,这可能会对性能产生影响,但这不太可能发生。您可以通过使用带有List参数的构造函数来测试它:

var originalList = new List<SomeClass>();

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

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

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


4
如果您不打算在运行时动态添加或删除项目,那么最好使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接