35

我想简单描述一下如何为我的 MVVM 中ItemsControl的数据绑定到一个虚拟化堆栈面板。ObservableCollection

我有一个ItemsControl实例在标签控制中的每个选项卡,当ItemsControl大幅增加时,切换选项卡变得非常慢。

我可以做些什么来加快应用程序的速度?

我打开了一个 WPF 分析器,看到每个选项卡的 ItemsControl 中显示的每个元素(这是一个自定义用户控件)都有自己的ContentPresenter. 因此,我ObservableCollection在 MVVM 中基本上有 100 个内容演示者,它们都在为 100 个项目运行。这是正确的吗?我该如何优化?

4

2 回答 2

52

有两种技术可能会有很大帮助。Bea Stolnitz 在她的博客上对它们都进行了很好的描述。

第一个是UI 虚拟化 ,第二个是数据虚拟化

在 UI 虚拟化中,您使用诸如 VirtualizingStackPanel 之类的东西来使 UI 绘制更少的东西。

数据虚拟化可确保当您只显示 100 个对象时不会将 100 万个对象带入内存。

所以 UI 虚拟化最小化了绘制的东西的数量,而数据虚拟化最小化了可以绘制的东西的数量。

希望有帮助

于 2009-09-21T10:23:40.057 回答
9

我在使用 TabControl 和 DataGrid 的 WPF 中遇到了完全相同的问题。通过增加 DataGrid 元素的大小,切换选项卡变得非常慢!之后,我发现这篇文章正在阅读 Bea Stolnitz 的博客,正如之前的答案所假设的那样。这给了我对谷歌“wpf tabcontrol VirtualizingStackPanel”的提示,它给了我到 DrWPF 的链接:http ://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd

他准确地描述了问题并给出了解决方案:-))

.... 性能命中是在树的构建过程中。不幸的是,如果
您使用典型的 MVVM 方法并绑定
TabControl 的 ItemsSource 属性,则每次
选择选项卡项时都必须重新构建整个树。这通常是一项非常昂贵的操作。……

于 2009-12-09T08:30:08.330 回答