将 ItemsControl 绑定到 ObservableCollection比 List更高效?

发布于 2024-09-09 04:28:14 字数 233 浏览 10 评论 0原文

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

I have a render-heavy item template in an ItemsControl and want to minimize the recreation of child item templates when ItemsSource signals a change. I am wondering if, because ObservableCollection can tell WPF precisely what has changed (as opposed to just the whole list), if it is more efficient in rendering changes to the collection, or if WPF is smart enough to reuse previous item views if it detects the same item is still in the changed list.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷情妓 2024-09-16 04:28:14

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

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

请注意,如果您使用虚拟化面板并启用了容器回收,则 ItemsControl 可以重用容器(例如 ListBoxItem)。请参阅链接。但是,它仍然无法重复使用容器中的内容。

Your suspicion is correct. WPF will not reuse previous views. If you replace the ItemsSource of an ItemsControl with a new List, it will create completely new views for each item in the list, even if the same items were in the old list.

You can test this yourself by putting a custom control in the ItemTemplate and adding a breakpoint or debug logging to its constructor. If you replace the ItemsSource with an identical list, you will see your control constructed once for each item in the list. On the other hand, when an item is added to an ObservableCollection you will only see it called once.

Note that the ItemsControl can reuse the container (such as ListBoxItem) if you are using a virtualizing panel and have container recycling enabled. See Link. It still can't reuse the contents of the container, however.

唐婉 2024-09-16 04:28:14

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

ObservableCollection only informs of addition and removal of objects - so perhaps not as precise as what you were expecting (if an object within the list changes, ObservableCollection will not fire off any notifications).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文