WPF列表框中的数据虚拟化

3
我有一个场景,其中我使用数据源设置ItemsSource属性来填充一个列表框并包含1000个项目。
我有一个要求,在UI加载时根据某些条件划掉列表框中的一个项目。我使用样式和附加属性来实现这一点,通过在附加属性的回调方法中设置ListBoxItemContentTemplate属性来完成。
我的问题是,当我尝试使用ItemContainerGenerator.ContainerFromItem生成一个ListBoxItem,对于位于列表末尾的项目,返回null。因此,我无法划掉列表框底部的项目。
是否与虚拟化有关?我想在加载时获取所有这些ListBoxItems
是否有任何解决办法?
谢谢
1个回答

3
这绝对是由虚拟化引起的。UI 虚拟化确切地做到了这一点 - 仅为屏幕上可见的项目创建 ListBoxItem 对象。您可以通过在 ListBox 上设置 VirtualizingStackPanel.IsVirtualizing = false 来轻松验证这确实是原因,然后查看 ItemContainerGenerator.ContainerFromItem 不再返回 null
您可以在 ListBox 中为您的 ListBoxItems 设置样式,该样式将具有相应的逻辑以根据需要划掉项目。即使启用虚拟化,这也应该有效。例如:
<ListBox>
    <ListBox.Resources>
        <Style TargetType=ListBoxItem>
            ...
        </Style>
    </ListBox.Resources>
</ListBox>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接