在BindingSource更新后抛出ArgumentOutOfRangeException的ListBox

时间:2014-09-11 10:37:54

标签: c# winforms binding listbox

尝试通过绑定源选择添加到列表框的新项目时,我收到此异常。

这是带有自定义对象的数据源的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'无效。)

如果我在系统例外中禁用调试中断程序继续并且该项目被选中,但我无法理解为什么如果列表框实际上有项目我会收到该错误。

1 个答案:

答案 0 :(得分:1)

发生错误是因为WPF内容异步发生。如果您尝试通过将新项目指定为SelectedItem来选择新项目,则会发现它可能无法被选中。您可以在TabControl上对此行为提出疑问。原因在于,仅仅因为您已将项目添加到数据源中并不意味着控件已呈现并在GUI中显示该项目。它需要做一些像生成容器(可能是ListBoxItem)的东西,如果还没有发生,那么该项目还没有真正添加。因此,当您设置SelectedIndex时,您会收到错误。

tl; dr:该项目尚未添加到GUI中,因此您的索引无效。仅仅因为支持集合的项目并不意味着它真的存在; - )