【问题标题】:Is binding an ItemsControl to an ObservableCollection<T> more efficient than a List<T>?将 ItemsControl 绑定到 ObservableCollection<T> 是否比 List<T> 更有效?
【发布时间】:2010-07-11 22:31:46
【问题描述】:

我在ItemsControl 中有一个重渲染项模板,并希望在ItemsSource 发出更改信号时尽量减少子项模板的重新创建。我想知道,因为ObservableCollection 是否可以准确地告诉 WPF 发生了什么变化(而不仅仅是整个列表),它是否更有效地呈现对集合的更改,或者 WPF 是否足够聪明,可以重用以前的项目视图,如果它检测到相同的项目仍在更改的列表中。

【问题讨论】:

    标签: c# wpf data-binding observablecollection itemscontrol


    【解决方案1】:

    你的怀疑是正确的。 WPF 不会重用以前的视图。如果您将 ItemsControl 的 ItemsSource 替换为新列表,它将为列表中的每个项目创建全新的视图,即使旧列表中存在相同的项目。

    您可以通过在 ItemTemplate 中放置自定义控件并向其构造函数添加断点或调试日志来自行测试。如果将 ItemsSource 替换为相同的列表,您将看到为列表中的每个项目构造了一次控件。另一方面,当一个项目被添加到 ObservableCollection 时,您只会看到它被调用一次。

    请注意,如果您使用虚拟化面板并启用容器回收,ItemsControl 可以重复使用容器(例如 ListBoxItem)。见http://blogs.msdn.com/b/vinsibal/archive/2008/05/14/recycling-that-item-container.aspx。但是,它仍然不能重用容器的内容。

    【讨论】:

      【解决方案2】:

      ObservableCollection 仅通知对象的添加和删除 - 因此可能不如您预期的那么精确(如果列表中的对象发生更改,ObservableCollection 不会触发任何通知)。

      【讨论】:

        猜你喜欢
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-08
        • 2011-10-17
        相关资源
        最近更新 更多