我手动填充了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项时得到了这个:
然后,应用程序显示第一个项目的内容。 其他编辑:我怀疑listbox.Items.Clear()的作用。如果我要替换内容,我需要它,但它是否会触发对SelectionChanged的调用,结果不可预测?
答案 0 :(得分:1)
selectionchanged事件在更改索引之前执行。你应该使用SelectedIndexChanged事件来满足你的需要。
答案 1 :(得分:0)
我已经放弃了尝试控制selectionChanged事件的流程。我很确定我的问题在于ListBox.Items.Clear()。我通过不覆盖列表但是根据原始选择在不同的ListBox中编写新条目来解决我自己的问题。
我想保留旧条目,但如果需要,可以在写完新条目后清除它们。