将WinForms ListBox绑定到对象属性

时间:2009-11-29 15:37:20

标签: winforms data-binding listbox

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

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

listBox.DataSource = controller.ItemNames;
listBox.DataBindings.Add(new Binding("SelectedItem", controller, "CurrentItem"));

我希望用户在列表框中选择不同的项目后立即更新控制器上的CurrentItem属性,但似乎只有在焦点移动到表单上的另一个项目时才会更新它。

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

3 个答案:

答案 0 :(得分:9)

一般情况下,如果您需要立即更新模型,则需要按照其他帖子的建议使用Use DataSourceUpdateMode.OnPropertyChanged。

但它对ListBox.SelectedItem不起作用。原因是因为ListBox没有暴露SelectedItemChanged事件(但是暴露了SelectedValueChanged和SelectedIndexChanged),所以DataBinding不知道控件中有什么变化。

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

listBox.SelectedIndexChanged +=
  (s, args) => listBox.DataBindings["SelectedItem"].WriteValue();

答案 1 :(得分:5)

使用DataSourceUpdateMode.OnPropertyChanged

listBox.DataBindings.Add(new Binding("SelectedItem", controller, "CurrentItem", 
                                true, DataSourceUpdateMode.OnPropertyChanged));

答案 2 :(得分:0)

在一般情况下(如果未指定ValueMember),如果绑定到复合对象,则可以使用SelectedValue,该值应等于SelectedItem

正如 Andrey ListBox所提及的,SelectedValue值更改的实时通知。

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

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

有一个副作用:设置CurrentItem不会更新ListBox

主 - 详细视图中,这应该没问题:首先,您必须确保SelectedItem(默认情况下第一个)与CurrentItem一致,然后工作流由主人ListBox

驱动

如果这是一个问题,请转到 Andrey 的解决方案。