3

我有一个场景,其中我填充了一个包含 1000 个项目的列表框。我ItemsSource使用数据源设置属性。

我有一个要求,当 UI 加载时,我需要根据某些条件删除列表框的一个项目。我正在使用样式+附加属性通过在附加属性的回调方法中设置ContentTemplate来实现相同的目的。ListBoxItem

我的问题是,当我尝试为列表末尾的项目生成ListBoxItemusing时,我得到空值。ItemContainerGenerator.ContainerFromItem结果,我无法删除列表底部的列表框项目。

它是否与虚拟化有关。我想获得所有ListBoxItems负载。

有什么解决方法吗?

谢谢

4

1 回答 1

3

这肯定是由虚拟化引起的。这正是 UI 虚拟化应该做的——只ListBoxItem为屏幕上可见的项目创建对象。你可以很容易地看到这确实是通过设置VirtualizingStackPanel.IsVirtualizing = false你的原因ListBox并看到ItemContainerGenerator.ContainerFromItem不再返回null

您可以为您ListBoxItems的内部设置一个样式,该样式ListBox将具有根据需要删除项目的逻辑。这在启用虚拟化时也应该有效。例如:

<ListBox>
    <ListBox.Resources>
        <Style TargetType=ListBoxItem>
            ...
        </Style>
    </ListBox.Resources>
</ListBox>
于 2012-08-16T07:41:54.590 回答