![](/img/trans.png)
[英]WPF binding ObservableCollection to ItemsControl - UI won't update
[英]Is binding an ItemsControl to an ObservableCollection<T> more efficient than a List<T>?
我在ItemsControl
中有一个渲染繁重的项目模板,并且希望在ItemsSource
发出更改信号时尽量减少子项目模板的重新创建。 我想知道,因为ObservableCollection
可以准确地告诉 WPF 发生了什么变化(而不是仅仅告诉整个列表),它是否更有效地呈现集合的变化,或者 WPF 是否足够聪明,如果它检测到,可以重用以前的项目视图同一项目仍在更改列表中。
你的怀疑是正确的。 WPF 不会重复使用以前的视图。 如果用新列表替换 ItemsControl 的 ItemsSource,它将为列表中的每个项目创建全新的视图,即使相同的项目在旧列表中也是如此。
您可以通过在 ItemTemplate 中放置自定义控件并向其构造函数添加断点或调试日志记录来自行测试。 如果用相同的列表替换 ItemsSource,您将看到为列表中的每个项目构造一次控件。 另一方面,当一个项目被添加到 ObservableCollection 时,您只会看到它被调用一次。
请注意,如果您使用虚拟化面板并启用容器回收,则 ItemsControl 可以重用容器(例如 ListBoxItem)。 请参阅链接。 但是,它仍然不能重用容器中的内容。
ObservableCollection 仅通知对象的添加和删除 - 因此可能不如您预期的那么精确(如果列表中的 object 发生更改,ObservableCollection 将不会触发任何通知)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.