ItemContainerGenerator.ContainerFromItem()在VirtualizingStackPanel.IsVirtualizing="False"时返回null。

11 浏览
0 Comments

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

0
0 Comments

问题:ItemContainerGenerator.ContainerFromItem()在VirtualizingStackPanel.IsVirtualizing="False"时返回null的原因和解决方法

当设置VirtualizingStackPanel的IsVirtualizing属性为False时,有时会遇到ItemContainerGenerator.ContainerFromItem()方法返回null的问题。下面我们来探讨一下这个问题的原因和解决方法。

解决方法是在调用ItemContainerGenerator.ContainerFromItem(item)之前执行UpdateLayout()方法。

代码示例:

this.UpdateLayout();
var container = this.ItemContainerGenerator.ContainerFromItem(item);

这个解决方法非常简洁有效,让人惊叹。有用户表示,他在解决这个问题上浪费了整整一个小时,尝试了各种建议,而这个答案帮助了他。

希望本文能对遇到类似问题的开发者们有所帮助。

0
0 Comments

使用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了。

0
0 Comments

在我的逻辑中,我在SelectionChanged事件中想知道为什么ItemContainerGenerator.ContainerFromItem方法总是返回null,即使Listbox.SelectedItem不为null,更奇怪的是,虚拟化已经被关闭了!查看ItemContainerGenerator.Status,我发现它是Primitives.GeneratorStatus.NotStarted,然后我添加了一个简单的测试ItemContainerGenerator.Status == Primitives.GeneratorStatus.ContainersGenerated,最终以这种方式解决了问题,而不需要订阅Status_Changed事件。

0