【问题标题】:Combobox Virtualization issue组合框虚拟化问题
【发布时间】:2014-11-14 05:48:23
【问题描述】:

当我将虚拟化设置为真时,我遇到了一个奇怪的问题,例如组合框样式,我有一个选中的组合框来检查组合框项目中的所有复选框。

在 ItemsPanel 属性中,我使用 VirtualizingStackPanel 进行了一些自定义样式,如下所示

<Setter Property="ItemsPanel">
        <Setter.Value>
          <ItemsPanelTemplate>
            <VirtualizingStackPanel IsItemsHost="True"
                                    IsVirtualizing="True"
                                    VirtualizationMode="Recycling" />
          </ItemsPanelTemplate>
        </Setter.Value>
      </Setter>

但是在滚动视图之前和之后,它是不同的。

例如,在这里我尝试在向下滚动项目面板后获取组合框的第一个项目

ComboBoxItem cmbItem = ComboBox1.ItemContainerGenerator.ContainerFromItem(ComboBox1.Items[0]) as ComboBoxItem;

但是,我在这里得到的只是 NULL。

那么我们是否可以使用虚拟化来实现这一点? (我知道它已经在虚拟化了!)。或者我们应该摆脱虚拟化并考虑另一种解决方案。我们看到,如果没有虚拟化属性,组合框的加载速度非常慢。

有什么想法吗?

提前致谢! :)

【问题讨论】:

  • 为什么要访问第一个(或特定的)ComboBoxItem?也许我们在这里有另一种方法。在虚拟化模式下,您想要获取的项目实际上可能不存在(不可见,未加载)。所以你必须处理一些回调/事件。
  • 我的第一个组合框项目是“全选”复选框,因为当我选中它时,所有组合框项目都会被选中。正如你所说的要处理一些回调/事件,我认为这将是代码中的额外开销。
  • 如果要勾选所有的复选框,只需修改数据项,每个CheckBox应该对应一个数据项的一些底层布尔属性.
  • @KingKing 对我来说似乎是正确的解决方案。实际上,它已经按照您建议的方式进行了设置,但之后我们将其删除。有点打算再次实施它.. :)

标签: c# wpf combobox wpf-controls data-virtualization


【解决方案1】:

NULL 直接是虚拟化的结果。虚拟化/回收的是 ComboBoxItem 实例。只有集合中可见的项目才会分配 ComboBoxItem,因此如果您要求任何不可见项目的 ComboBoxItem,您将返回 NULL。

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2023-03-24
    • 1970-01-01
    • 2012-04-14
    • 2019-06-30
    相关资源
    最近更新 更多