更新BindingSource后,ListBox引发ArgumentOutOfRangeException
本文关键字:引发 ArgumentOutOfRangeException ListBox BindingSource 更新 | 更新日期: 2023-09-27 18:21:40
当我试图选择通过其绑定源添加到列表框中的新项时,会出现此异常。
这是具有自定义对象的DataSource的BindingSource
BindingSource bs = new BindingSource() { DataSource = myObjectsList };
listbox.DataSource = bs;
listbox.DisplayMember = "MyObjectProperty";
当我向BindingSource添加新项目时,列表框会更新,但我无法选择新项目
bs.Add(new MyObject());
int newItemIndex = listbox.Items.Count - 1; // this returns the right index of the new added item
listbox.SelectedIndex = newItemIndex;
这里我得到System.ArgumentOutOfRangeException(InvalidArgument="0"的值对"SelectedIndex"无效。)
如果我在系统异常中禁用调试中断,程序会继续,项目会被选中,但我不明白如果列表框中确实有项目,为什么会出现这个错误。
错误的发生是因为在WPF中东西是异步发生的。如果您试图通过将新项目指定为SelectedItem
来选择它,您会发现它可能不会被选中。您可以在TabControl
上对此行为提出疑问。原因是,仅仅因为您已经将该项添加到数据源中,并不意味着控件已经在GUI中呈现并显示了该项。它需要做一些事情,比如生成容器(可能是ListBoxItem
),如果这还没有发生,那么项目还没有真正添加。因此,当您设置SelectedIndex
时,会出现错误。
tl;dr:该项尚未添加到GUI中,因此您的索引无效。仅仅因为支持集合有项目,并不意味着它真的在那里;-)