当VirtualizingStackPanel.IsVirtualizing =“False”时,ItemContainerGenerator.ContainerFromItem()返回null

我在这个问题上面临着类似的问题,但VirtualizingStackPanel.IsVirtualizing="False"并没有解决我的问题。 有没有人面临同样的问题?

问题是我有一个自定义combobox,

                                                      

然而我无法获得对via内部复选框的引用,

 this.ItemContainerGenerator.ContainerFromItem(this.Items[0]) as ComboBoxItem; 

有什么建议吗?

我真正想要实现的是,

我想更改checkboxes ischecked属性,这取决于可以在运行时更改的其他对象。 我不能使用绑定,因为整个项目的当前状态,此时我无法改变。 所以基本上一旦创建了新的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); } 

尝试在this.ItemContainerGenerator.ContainerFromItem(item)之前执行UpdateLayout() this.ItemContainerGenerator.ContainerFromItem(item)

使用ComConBox中的ItemContainerGenerator.StatusChanged事件,如下所示:

 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); } } } 

由于我的逻辑是在SelectionChanged事件中,我想知道为什么ItemContainerGenerator.ContainerFromItem方法总是返回null,即使Listbox.SelectedItem不为null,甚至更奇怪,虚拟化被关闭! 看看ItemContainerGenerator.Status我看到它是Primitives.GeneratorStatus.NotStarted然后我在ItemContainerGenerator.Status == Primitives.GeneratorStatus.ContainersGenerated上添加了一个简单的测试,最后以这种方式解决了它,并且不需要加入Status_Changed事件。