INotifyCollectionChanged——它触发的频率(以及它们如何使其如此高效/快速)

本文关键字:何使其 高效 快速 频率 INotifyCollectionChanged | 更新日期: 2023-09-27 18:10:30

基本上,我想知道它实际上是如何高效的。

示例代码:

void GetItems()
{
    foreach (var item in items)
        myObservableCollection.Add(item);
}

这会不会每次触发CollectionChanged事件,导致UI必须每次刷新?或者它这样做是为了等待GetItems函数完成?

基本上,WPF似乎处理得很好,我想知道他们是如何做到的。

INotifyCollectionChanged——它触发的频率(以及它们如何使其如此高效/快速)

优化性能:数据绑定提供了有关如何解析数据绑定的一些背景知识,包括不同项源的性能含义。看一下绑定到ItemsSource一节。

考虑这样一个场景:您有一个CLR List对象,它保存要在列表框中显示的员工列表。创建一个这两个对象之间的通信,您将绑定您的雇员列表到列表框的ItemsSource属性。然而,假设你让一名新员工加入你的团队。你可能会这么想要将这个新人员插入到绑定的ListBox值中,您可以只需将此人添加到您的员工列表中,并期待这种变化被数据绑定引擎自动识别。

这个假设将被证明是错误的;实际上,这种变化不会将自动反映在列表框中。这是因为CLR列表对象不会自动引发已更改的集合事件。为了让ListBox拾取更改,您需要必须重新创建你的员工名单并将其附加到ItemsSource属性。虽然这个解决方案有效,但它引入了巨大的性能影响。每次你重新分配ItemsSource的ListBox的一个新对象,ListBox首先扔掉并重新生成它的整个列表。的性能如果你的ListBox映射到一个复杂的DataTemplate,影响会被放大。

一个非常有效的解决这个问题的方法是让你的员工列出ObservableCollection。ObservableCollection对象引发一个更改通知,数据绑定引擎可以接收。事件从ItemsControl中添加或删除项无需重新生成整个列表。

1项更新时间(ms)

  • 到CLR List对象= 1656 ms
  • To an ObservableCollection = 20 ms

WPF从不直接绑定到集合。如果您指定一个集合作为绑定源,WPF实际上绑定到集合的默认视图。

集合视图是绑定源集合之上的一层它允许您导航和显示基于的源集合对查询进行排序、筛选和分组,而无需更改底层源集合本身。还维护一个集合视图指向集合中当前项的指针。如果来源集合实现了INotifyCollectionChanged接口由CollectionChanged事件引发的更改将传播到观点。

每次更改都会触发该事件。

GUI不必每次都做出反应和刷新,它可以推迟。
我知道WinForms会优化这一点,我想WPF也有类似的方法。

如果您想查看UI请求新鲜结果的频率,请将其作为公共属性公开,并在myObservableCollection的公共属性的get (assessor)中放置调试行