WPF无法在第7项之后按项目或索引获取ListBoxItem

时间:2017-03-23 07:49:57

标签: c# wpf listbox listboxitem

我有一个奇怪的问题,我试图更新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个项目

之后开始返回null
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));
            }
        });
    }
}

2 个答案:

答案 0 :(得分:2)

默认情况下,ListBoxes上的UI虚拟化设置为True。如果启用了UI虚拟化,则仅为可见项创建容器。尝试设置此附加属性:

VirtualizingStackPanel.IsVirtualizing="False" 

答案 1 :(得分:0)

要解决此问题,我必须导致绑定。

问题在于,因为列表视图中一次只显示7个项目,所以只绘制了7个项目,为了解决这个问题,我可以滚动到第7个项目之后的下一个项目,依此类推,但这明显变慢了。