我有一个场景,我在其中填充一个包含1000个项目的列表框。我将ItemsSource
属性设置为数据源。
我有一个要求,当UI加载时,我需要根据某些条件删除列表框中的项目。我通过在附加属性的回调方法中设置ContentTemplate
ListBoxItem
来使用样式+附加属性来实现相同的目的。
我的问题是当我尝试使用ListBoxItem
生成ItemContainerGenerator.ContainerFromItem
时,对于位于列表末尾的项目,我得到null。因此,我无法删除列表底部列表框中的项目。
是否与虚拟化有关。我希望在加载时获得所有ListBoxItems
。
有解决方法吗?
由于
答案 0 :(得分:3)
这绝对是由虚拟化引起的。这正是UI虚拟化应该做的事情 - 只为屏幕上可见的项创建ListBoxItem
个对象。您可以通过在VirtualizingStackPanel.IsVirtualizing = false
上设置ListBox
并看到ItemContainerGenerator.ContainerFromItem
不再返回null
来轻松查看确实是这个原因。
您可以为ListBoxItems
中的ListBox
设置一种样式,该样式具有根据需要删除项目的逻辑。启用虚拟化时,这也应该有效。例如:
<ListBox>
<ListBox.Resources>
<Style TargetType=ListBoxItem>
...
</Style>
</ListBox.Resources>
</ListBox>