WPF列表框中的数据虚拟化

时间:2012-08-16 07:04:41

标签: wpf listbox virtualization listboxitems data-virtualization

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

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

我的问题是当我尝试使用ListBoxItem生成ItemContainerGenerator.ContainerFromItem时,对于位于列表末尾的项目,我得到null。因此,我无法删除列表底部列表框中的项目。

是否与虚拟化有关。我希望在加载时获得所有ListBoxItems

有解决方法吗?

由于

1 个答案:

答案 0 :(得分:3)

这绝对是由虚拟化引起的。这正是UI虚拟化应该做的事情 - 只为屏幕上可见的项创建ListBoxItem个对象。您可以通过在VirtualizingStackPanel.IsVirtualizing = false上设置ListBox并看到ItemContainerGenerator.ContainerFromItem不再返回null来轻松查看确实是这个原因。

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

<ListBox>
    <ListBox.Resources>
        <Style TargetType=ListBoxItem>
            ...
        </Style>
    </ListBox.Resources>
</ListBox>