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