我有一个场景,我用 1000 个项目填充一个列表框。我使用数据源设置 ItemsSource
属性。
我有一个要求,当 UI 加载时,我需要根据特定条件删除列表框中的项目。我使用样式 + 附加属性通过在附加属性的回调方法中设置 ListBoxItem
的 ContentTemplate
来实现相同的目的。
我的问题是,当我尝试使用 ItemContainerGenerator.ContainerFromItem
生成 ListBoxItem
时,对于列表末尾的项目,我得到 null。因此,我无法删除位于列表底部的列表框中的项目。
跟虚拟化有关系吗?我想在加载时获取所有这些 ListBoxItems
。
有什么解决方法吗?
谢谢
最佳答案
这肯定是虚拟化造成的。这正是 UI 虚拟化应该做的——只为屏幕上可见的项目创建 ListBoxItem
对象。通过在 ListBox
上设置 VirtualizingStackPanel.IsVirtualizing = false
可以很容易地看出这确实是原因,并且可以看到 ItemContainerGenerator.ContainerFromItem
不再返回空
。
您可以在 ListBox
中为您的 ListBoxItems
设置一个样式,该样式将具有根据需要删除项目的逻辑。这在启用虚拟化时也应该有效。例如:
<ListBox>
<ListBox.Resources>
<Style TargetType=ListBoxItem>
...
</Style>
</ListBox.Resources>
</ListBox>
关于wpf - WPF 列表框中的数据虚拟化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11982235/