将WinForms列表框绑定到对象属性

将WinForms列表框绑定到对象属性,winforms,data-binding,listbox,Winforms,Data Binding,Listbox,我第一次做一些WinForms编码,并尝试使用数据绑定 我有一个列表框,我将它绑定到控制器对象中的字符串数组,我还想将列表框中的SelectedItem绑定到控制器上的另一个字符串属性,以便跟踪它 listBox.DataSource = controller.ItemNames; listBox.DataBindings.Add(new Binding("SelectedItem", controller, "CurrentItem")); 我希望当用户在列表框中选择不同的项目时,控制器上的

我第一次做一些WinForms编码,并尝试使用数据绑定

我有一个列表框,我将它绑定到控制器对象中的字符串数组,我还想将列表框中的SelectedItem绑定到控制器上的另一个字符串属性,以便跟踪它

listBox.DataSource = controller.ItemNames;
listBox.DataBindings.Add(new Binding("SelectedItem", controller, "CurrentItem"));
我希望当用户在列表框中选择不同的项目时,控制器上的CurrentItem属性立即更新,但似乎只有当焦点移动到表单上的另一个项目时,它才会更新

这是预期的行为吗?有没有办法让SelectedItem绑定立即更新?

使用


一般来说,如果您需要立即更新模型,则需要使用DataSourceUpdateMode.OnPropertyChanged,如另一篇文章中所建议的

但它不适用于ListBox.SelectedItem。原因是ListBox不公开SelectedItemChanged事件(但公开SelectedValueChanged和SelectedIndexChanged),因此数据绑定不知道控件中发生了更改

作为一种解决方法,您可以在控件的设置代码中放入以下行:

listBox.SelectedIndexChanged +=
  (s, args) => listBox.DataBindings["SelectedItem"].WriteValue();
在一般情况下(
ValueMember
未指定),如果绑定到复合对象,则可以利用
SelectedValue
,该值应等于
SelectedItem

如Andrey所述,列表框为
选择的值
值更改提供实时通知

所以这个代码应该足够了:

listBox.DataBindings.Add("SelectedValue", controller, "CurrentItem", true, DataSourceUpdateMode.OnPropertyChanged);
有一个副作用:设置
CurrentItem
将不会更新
列表框

主详细视图中,这应该是可以的:开始时,您只需确保
SelectedItem
(默认情况下第一个)与
CurrentItem
一致,然后工作流由主视图
列表框
驱动

如果这是一个问题,那么就去找安德烈的解决方案

listBox.DataBindings.Add("SelectedValue", controller, "CurrentItem", true, DataSourceUpdateMode.OnPropertyChanged);