我第一次做了一些WinForms编码,并尝试使用数据绑定。
我有一个列表框,它从我的控制器对象绑定到一个字符串数组,我还想将列表框中的SelectedItem绑定到控制器上的另一个字符串属性,以便我可以跟踪它。
listBox.DataSource = controller.ItemNames;
listBox.DataBindings.Add(new Binding("SelectedItem", controller, "CurrentItem"));
我希望用户在列表框中选择不同的项目后立即更新控制器上的CurrentItem属性,但似乎只有在焦点移动到表单上的另一个项目时才会更新它。
这是预期的行为吗?有没有办法立即更新SelectedItem绑定?
答案 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 的解决方案。