我有一个奇怪的问题,我试图更新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;
}
我认为这可能与我尝试设置复选框状态的时间有关,因为我在添加该项目后尝试这样做?我已经在SO上阅读了有关这个领域的一些问题,但到目前为止,没有一个能够帮助我解决我的问题,我认为这个答案可能很接近......但它给了我同样的结果:{{3 }}
这些项目没有绑定,它们是使用ListBox.Items.Add添加的(不太熟悉绑定)。
我也在后台线程中这样做,因为我需要定期刷新列表框的内容,并且需要进行api调用才能这样做。
用于更新列表框内容的方法如下所示。 SetItemChecked
调用第一个获取复选框的方法,但是在第7个项目
public void ResetAndAddItems<T>(IEnumerable<T> items, string displayByProperty = "",
Func<T, string> displayByFunc = null,
Dictionary<string, bool> checkedStates = null,
Func<ListItem<T>, Dictionary<string, bool>, bool> checkedStatesKeyFunc = null)
{
Dispatcher.Invoke(() =>
{
LstItems.Items.Clear();
});
var listedItems = items?.ToList();
if (listedItems == null || !listedItems.Any())
{
return;
}
foreach (var item in listedItems)
{
var listItem = new ListItem<T>
{
DisplayByProperty = displayByProperty,
DisplayByFunc = displayByFunc,
Item = item
};
Dispatcher.Invoke(() =>
{
LstItems.Items.Add(listItem);
if (checkedStates != null && checkedStatesKeyFunc != null)
{
SetItemChecked(item, checkedStatesKeyFunc(item as ListItem<T>, checkedStates));
}
});
}
}
答案 0 :(得分:2)
默认情况下,ListBoxes上的UI虚拟化设置为True。如果启用了UI虚拟化,则仅为可见项创建容器。尝试设置此附加属性:
VirtualizingStackPanel.IsVirtualizing="False"
答案 1 :(得分:0)
要解决此问题,我必须导致绑定。
问题在于,因为列表视图中一次只显示7个项目,所以只绘制了7个项目,为了解决这个问题,我可以滚动到第7个项目之后的下一个项目,依此类推,但这明显变慢了。