Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF无法按项目或第7项后的索引获取ListBoxItem_C#_Wpf_Listbox_Listboxitem - Fatal编程技术网

C# WPF无法按项目或第7项后的索引获取ListBoxItem

C# WPF无法按项目或第7项后的索引获取ListBoxItem,c#,wpf,listbox,listboxitem,C#,Wpf,Listbox,Listboxitem,我遇到了一个奇怪的问题,当我试图更新ListBoxItem中包含的复选框的选中状态时,我无法在第7项之后获取ListBoxItem。我尝试了几种方法使其工作,如下面的方法所示。itemIndex每次都有一个正值(因此我知道该项正在被找到),但为什么它不能获取listboxitem我不知道 private IEnumerable<CheckBox> GetListBoxItemCheckBoxes(object item) { var itemIndex = LstItems.

我遇到了一个奇怪的问题,当我试图更新ListBoxItem中包含的复选框的选中状态时,我无法在第7项之后获取ListBoxItem。我尝试了几种方法使其工作,如下面的方法所示。itemIndex每次都有一个正值(因此我知道该项正在被找到),但为什么它不能获取listboxitem我不知道

private IEnumerable<CheckBox> GetListBoxItemCheckBoxes(object item)
{
    var itemIndex = LstItems.Items.IndexOf(item);
    var selectedListBoxItem = LstItems.ItemContainerGenerator.ContainerFromIndex(itemIndex) as ListBoxItem;
    var selectedListBoxItemCheckBoxes = selectedListBoxItem?.FindVisualChildrenOfType<CheckBox>();

    if (selectedListBoxItemCheckBoxes == null)
    {
        selectedListBoxItem = LstItems.ItemContainerGenerator.ContainerFromItem(item) as ListBoxItem;
        selectedListBoxItemCheckBoxes = selectedListBoxItem?.FindVisualChildrenOfType<CheckBox>();

        if (selectedListBoxItemCheckBoxes == null)
        {
            itemIndex = LstItems.ItemContainerGenerator.Items.IndexOf(item);
            selectedListBoxItem = LstItems.ItemContainerGenerator.ContainerFromIndex(itemIndex) as ListBoxItem;
            selectedListBoxItemCheckBoxes = selectedListBoxItem?.FindVisualChildrenOfType<CheckBox>();
        }
    }

    return selectedListBoxItemCheckBoxes;
}

在列表框上,UI虚拟化默认设置为True。如果启用了UI虚拟化,则只会为可见项创建容器。尝试设置此附加属性:

VirtualizingStackPanel.IsVirtualizing="False" 

为了解决这个问题,我必须进行绑定


问题在于,由于listview上一次只显示7个项目,因此仅绘制了7个项目,为了解决这个问题,我可以滚动到第7个项目之后的下一个项目,以此类推,但速度明显较慢。

是的,加载时间和内存消耗会增加。但是,这是确保所有容器每次可用于所有ListBoxItems的唯一方法。我可以知道你想完成什么吗?您真的需要checkbox实例还是只需要checked状态?如果是后者,则数据绑定是解决方案。尝试设置复选框选中状态,但对绑定不是100%确定,因此我知道的唯一方法是获取实例并自行设置。我知道,数据绑定是正确的方法。但是,在未启用虚拟化的情况下,您可以尝试先测量性能。通常情况下,如果你不希望有成千上万的物品,而且你的物品模板也没有那么深,那也没关系。只是想尝试一下,不幸的是,同样的问题
VirtualizingStackPanel.IsVirtualizing="False"