wpf - WPF 列表框中的数据虚拟化

标签 wpf listbox virtualization listboxitems data-virtualization

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

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

我的问题是,当我尝试使用 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/

相关文章:

c# - C#/WPF 中禁用的复选框上的鼠标按钮事件

c# - 如何添加不同的列表框项目 WPF

c# - 使用 SQL (SDF) 数据库中的项填充 WPF 列表框

html - 无法让无序列表水平显示

c# - WPF关于打开窗口和后退按钮的良好实践

c# - 如何使用tabControl在XAML中使用两个ViewModels代码

wpf - 如果 XAML 中的条件

linux - 创建非共享命名空间

windows - 虚拟机测试套件

continuous-integration - 使用持续集成部署到虚拟机以运行集成测试