ItemContainerGenerator.ContainerFromItem()在VirtualizingStackPanel.IsVirtualizing="False"时返回null。
ItemContainerGenerator.ContainerFromItem()在VirtualizingStackPanel.IsVirtualizing="False"时返回null。
我遇到了与这个问题类似的问题,但是VirtualizingStackPanel.IsVirtualizing="False"
并没有解决我的问题。有人遇到了相同的问题吗?
问题是我有一个自定义的组合框,
然而,通过this.ItemContainerGenerator.ContainerFromItem(this.Items[0]) as ComboBoxItem;
无法获得内部的复选框的引用。有什么建议吗?
实际上我想要实现的是,
我想要改变复选框的选中属性,该属性取决于其他可能在运行时更改的对象。由于整个项目的当前状态无法更改,我无法使用绑定来完成。所以基本上一旦创建了新的MultiSelectionComboBox,我想要做的是这样的:
foreach (object item in this.Items) { ComboBoxItem comboBoxItem = this.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem; if (comboBoxItem == null) continue; FrameworkElement element = comboBoxItem.ContentTemplate.LoadContent() as FrameworkElement; CheckBox checkBox = element.FindName("CheckBoxItem") as CheckBox; checkBox.IsChecked = this.SelectedItem.Contains(item); }
问题:ItemContainerGenerator.ContainerFromItem()在VirtualizingStackPanel.IsVirtualizing="False"时返回null的原因和解决方法
当设置VirtualizingStackPanel的IsVirtualizing属性为False时,有时会遇到ItemContainerGenerator.ContainerFromItem()方法返回null的问题。下面我们来探讨一下这个问题的原因和解决方法。
解决方法是在调用ItemContainerGenerator.ContainerFromItem(item)之前执行UpdateLayout()方法。
代码示例:
this.UpdateLayout(); var container = this.ItemContainerGenerator.ContainerFromItem(item);
这个解决方法非常简洁有效,让人惊叹。有用户表示,他在解决这个问题上浪费了整整一个小时,尝试了各种建议,而这个答案帮助了他。
希望本文能对遇到类似问题的开发者们有所帮助。
使用ItemContainerGenerator.StatusChanged事件来监听ComboBox的状态变化,代码如下:
myComboBox.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged; void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e) { if (myComboBox.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) { foreach (var item in myComboBox.Items) { var container = (ComboBoxItem)LanguageComboBox.ItemContainerGenerator.ContainerFromItem(item); } } }
这段代码的目的是在ComboBox的ItemContainer生成完毕后,遍历所有的Item,并通过ItemContainerGenerator.ContainerFromItem()方法获取对应的Container。
然而,当VirtualizingStackPanel的IsVirtualizing属性设置为False时,调用ItemContainerGenerator.ContainerFromItem()方法可能会返回null。这是因为IsVirtualizing属性为False时,ComboBox会一次性生成所有的ItemContainer,而不是根据需要进行虚拟化生成。
要解决这个问题,可以通过设置VirtualizingStackPanel的IsVirtualizing属性为True来启用虚拟化。这样就可以保证ItemContainerGenerator.ContainerFromItem()方法正常工作。代码如下:
将VirtualizingStackPanel的IsVirtualizing属性设置为True即可解决该问题。这样ComboBox会根据需要进行虚拟化生成ItemContainer,而不会一次性生成所有的ItemContainer。这样就能够正常使用ItemContainerGenerator.ContainerFromItem()方法获取对应的Container了。
在我的逻辑中,我在SelectionChanged事件中想知道为什么ItemContainerGenerator.ContainerFromItem方法总是返回null,即使Listbox.SelectedItem不为null,更奇怪的是,虚拟化已经被关闭了!查看ItemContainerGenerator.Status,我发现它是Primitives.GeneratorStatus.NotStarted,然后我添加了一个简单的测试ItemContainerGenerator.Status == Primitives.GeneratorStatus.ContainersGenerated,最终以这种方式解决了问题,而不需要订阅Status_Changed事件。