以下代码按预期工作,MyProperty当用户在下拉列表中选择新项目时,模型上的代码就会更新。
MyProperty
comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true, DataSourceUpdateMode.OnPropertyChanged);
但是,以下操作不能以相同的方式工作,并且只有在输入焦点移至表单上的另一个控件时才触发模型更新:
comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true, DataSourceUpdateMode.OnPropertyChanged);
有人知道为什么吗?我什至不知道从哪里开始调查原因。朝着正确方向开始调查或直接进行解释的指针将同样受到赞赏。
撇开 :出于我的目的,我最终绑定到SelectedItem和SelectedValue。这样,我就可以基于UI更改(通过SelectedValue绑定)获得即时模型更新,并且可以基于程序化模型更改(通过SelectedItem绑定)获得UI更新。
SelectedItem
SelectedValue
该ComboBox控件继承自该ListControl控件。
ComboBox
ListControl
该SelectedItem属性是ComboBox控件的适当成员。更改触发的事件是ComboBox.SelectionChangeCommitted
ComboBox.SelectionChangeCommitted
当所选项目已更改并且在ComboBox中显示该更改时发生。
该SelectedValue属性是从ListControl控件继承的。因此,此属性将触发ListControl.SelectedValueChanged事件。
ListControl.SelectedValueChanged
在SelectedValue属性更改时发生。
也就是说,他们不会解雇INotifyPropertyChanged。PropertyChanged事件相同,但无论如何都会如此。唯一的区别是触发事件。SelectedValueChanged从组合框的列表部分中做出新选择后立即触发,并在组合框SelectedItemChanged的文本框部分中显示该项目时触发。
INotifyPropertyChanged
PropertyChanged
SelectedValueChanged
SelectedItemChanged
简而言之,它们都代表了ComboBox列表部分中的某些内容。因此,绑定任何一个属性时,结果都是相同的,因为PropertyChanged无论哪种情况都会触发该事件。并且由于它们都代表列表中的一个元素,因此它们可能会被视为相同。
这有帮助吗?
编辑#1
假设ComboBox的列表部分代表一个属性(由于我没有编写控件,所以我无法确认),绑定SelectedItem或SelectedValue影响控件内的同一集合。然后,当更改此属性时,最后也会发生相同的情况。该INotifyPropertryPropertyChanged.PropertyChanged事件在同一媒体资源上触发。
INotifyPropertryPropertyChanged.PropertyChanged