将ItemsControl绑定到ObservableCollection<T>比绑定到List<T>更有效吗?

3

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

2个回答

4
您的猜想是正确的。WPF不会重用之前的视图。如果您使用新列表替换ItemsControl的ItemsSource,则它将为列表中的每个项创建全新的视图,即使相同的项在旧列表中也存在。
您可以通过将自定义控件放入ItemTemplate并将断点或调试日志添加到其构造函数中来自行测试此功能。如果使用相同的列表替换ItemsSource,则会看到为列表中的每个项构建一次控件。另一方面,当向ObservableCollection添加项目时,您只会看到它被调用一次。
请注意,如果您使用虚拟化面板并启用容器回收,则ItemsControl可以重用容器(例如ListBoxItem)。但是,它仍无法重用容器的内容。请参见Link

0

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


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