我有一个没有虚拟化的 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。仍然没有虚拟化。
我错过了什么?