2

我有一个没有虚拟化的 ListBox。我显然错过了一些东西,但找不到它。

它实际上是 ListBox 中的 ListBox。外部 ListBox 有一个 ItemTemplate,其中包含一个 Expander。Expander 用于显示一组项目。Expander 的内容是显示项目的第二个 ListBox。第二个 ListBox 上的 ItemTemplate 绑定到要显示的实际 Item。我的项目的 ViewModel 类具有许多属性,这些属性在调用属性 Get 之前不会初始化数据。但是,WPF 会遍历每个项目并导致初始化逻辑,这是我试图避免的。

我发现使用 ListCollectionView.GroupDescription 会导致 ListBox 无法虚拟化。现在我在 ViewModel 中处理我自己的分组。我的外部 ListBox 绑定到 ObservableCollection(ItemGroupViewModel),其中 ItemGroupViewModel 有一个 GroupName 和一个项目列表。第二个 ListBox 绑定到 ItemGroupViewModel 中的项目。这并没有解决问题。我还在调试时检查了 VirtualizingStackPanel.GetIsVirtualizing(),它返回 true,但 WPF 仍在遍历每个项目。我已经仔细检查以确保我的分组逻辑不会触发每个项目中的数据初始化逻辑,这是我试图避免的。

我认为 IsSharedSizeScope 可能会导致 ListBox 呈现所有项目以确定列大小。所以我关闭了 SharedSizeScope。仍然没有虚拟化。

我错过了什么?

4

1 回答 1

2

它不是虚拟化的,因为它在扩展器中,扩展器的模板是一个 headeredcontentcontrol(据我所知),它的模板包含一个堆栈面板。

stackpanel 的内容永远不会在其堆叠方向上对齐拉伸,因此您的列表框将始终拥有它要求的所有空间,然后您就没有虚拟化。您的内部列表框也不会获得任何垂直滚动条。

你有一个解决方案(至少:)

1:在您的内部列表框上设置 maxheight - 可能是最简单的。

希望能帮助到你 :)

于 2012-09-24T19:47:40.717 回答