listBox selectedIndex始终为0,除非我让线程等待

时间:2016-07-20 14:39:57

标签: c# wpf multithreading listbox

我手动填充了listBox。当用户选择项目时,我使用所选索引的值来重新创建包含新数据的列表。但是,它似乎总是返回0,除非我放入一个断点。使用断点它完美地工作。我查看了一个问题:WPF ListBox SelectionChanged event并且让线程睡眠70毫秒的建议在大多数情况下都有效。 200ms工作更加可靠!!

我猜这是一个线程问题,但我不知道如何使事件处理程序等待选择事件正确完成而不是Thread.Sleep(),这显然不能令人满意。

我尝试使用e.AddedItems,但是遇到了同样的问题 - 在事件完成之前没有AddedItems。我不得不让线程睡眠以确保有一些工作要做。这是我的事件处理程序代码:

private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (listBox.SelectedIndex != -1)
        {
            selectedTopicID = listBox.SelectedIndex;
            listBox.Items.Clear();  //Breakpoint at start of line will fix issue
            foreach (Skill skill in setOfSkills)
            {
                if (skill.topicID == selectedTopicID)
                {
                    string skillName = skill.skillName;
                    ListBoxItem nextSkill = new ListBoxItem();
                    nextSkill.Content = skillName;
                    nextSkill.Height = 50;
                    listBox.Items.Insert(0, nextSkill);
                }
            }
            currentList = CurrentListType.Skill;
        }
    }

感谢任何建议。

响应KANAX我添加了SelectedIndex的Console输出,当我选择第5项时得到了这个:

enter image description here

然后,应用程序显示第一个项目的内容。 其他编辑:我怀疑listbox.Items.Clear()的作用。如果我要替换内容,我需要它,但它是否会触发对SelectionChanged的调用,结果不可预测?

2 个答案:

答案 0 :(得分:1)

selectionchanged事件在更改索引之前执行。你应该使用SelectedIndexChanged事件来满足你的需要。

选中此项https://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.selectedindexchanged(v=vs.110).aspx

答案 1 :(得分:0)

我已经放弃了尝试控制selectionChanged事件的流程。我很确定我的问题在于ListBox.Items.Clear()。我通过不覆盖列表但是根据原始选择在不同的ListBox中编写新条目来解决我自己的问题。

我想保留旧条目,但如果需要,可以在写完新条目后清除它们。