我在ItemsControl
中有一个渲染繁重的项目模板,并希望在ItemsSource
发出更改信号时最小化子项目模板的重新创建。我想知道是否,因为ObservableCollection
可以准确地告诉WPF什么已经改变(而不仅仅是整个列表),是否更有效地渲染集合的更改,或者WPF是否足够聪明以重用以前的项目视图是否检测到相同的项目仍在更改的列表中。
答案 0 :(得分:4)
你的怀疑是正确的。 WPF不会重用以前的视图。如果将ItemsControl的ItemsSource替换为新的List,它将为列表中的每个项创建全新的视图,即使旧列表中的相同项也是如此。
您可以通过在ItemTemplate中放置自定义控件并向其构造函数添加断点或调试日志记录来自行测试。如果使用相同的列表替换ItemsSource,您将看到为列表中的每个项构造一次您的控件。另一方面,当一个项目被添加到ObservableCollection时,您将只看到它被调用一次。
请注意,如果您使用虚拟化面板并启用了容器回收,则ItemsControl可以重用容器(例如ListBoxItem)。见http://blogs.msdn.com/b/vinsibal/archive/2008/05/14/recycling-that-item-container.aspx。但是,它仍然无法重用容器的内容。
答案 1 :(得分:0)
ObservableCollection仅通知对象的添加和删除 - 因此可能不如您期望的那样精确(如果列表中的对象发生更改,ObservableCollection将不会触发任何通知)。