我有一个没有虚拟化的ListBox。我显然遗漏了一些东西,却找不到它。
它实际上是ListBox中的ListBox。外部ListBox有一个ItemTemplate,它包含一个Expander。 Expander用于显示一组项目。 Expander的内容是显示项目的第二个ListBox。第二个ListBox上的ItemTemplate绑定到要显示的实际Item。我的项的ViewModel类有许多属性,在调用属性Get之前不会初始化数据。但是,WPF正在遍历每个项目并导致初始化逻辑,我正试图避免这种情况。
我发现使用ListCollectionView.GroupDescription会导致ListBox不进行虚拟化。现在我在ViewModel中处理我自己的分组。我的外部ListBox绑定到ObservableCollection(ItemGroupViewModel),其中ItemGroupViewModel具有GroupName和Items列表。第二个ListBox绑定到ItemGroupViewModel中的Items。这并没有解决问题。我还在调试时检查了VirtualizingStackPanel.GetIsVirtualizing(),它返回true,但WPF仍在遍历每个项目。我已经仔细检查以确保我的分组逻辑不会触发每个项目中的数据初始化逻辑,我正试图避免这种情况。
我认为IsSharedSizeScope可能导致ListBox呈现所有项目以确定列大小。所以我关闭了SharedSizeScope。仍然没有虚拟化。
我错过了什么?
答案 0 :(得分:2)
它不是虚拟化,因为它在扩展器内,扩展器的模板是一个headeredcontentcontrol(据我记得),它的模板包含一个stackpanel。
stackpanel的内容永远不会在堆叠的方向上进行对齐拉伸,因此您的列表框将始终拥有它所要求的所有空间,然后您就不会进行虚拟化。您的内部列表框也不会获得任何verticalscrollbar。
你有一个解决方案(至少:)
1:在内部列表框上设置maxheight - 可能是最简单的。
希望有所帮助:)