小编典典

ComboBox SelectedItem与SelectedValue

c#

以下代码按预期工作,MyProperty当用户在下拉列表中选择新项目时,模型上的代码就会更新。

comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true,
DataSourceUpdateMode.OnPropertyChanged);

但是,以下操作不能以相同的方式工作,并且只有在输入焦点移至表单上的另一个控件时才触发模型更新:

comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true, 
DataSourceUpdateMode.OnPropertyChanged);

有人知道为什么吗?我什至不知道从哪里开始调查原因。朝着正确方向开始调查或直接进行解释的指针将同样受到赞赏。

撇开
:出于我的目的,我最终绑定到SelectedItemSelectedValue。这样,我就可以基于UI更改(通过SelectedValue绑定)获得即时模型更新,并且可以基于程序化模型更改(通过SelectedItem绑定)获得UI更新。


阅读 774

收藏
2020-05-19

共1个答案

小编典典

ComboBox控件继承自该ListControl控件。

SelectedItem属性是ComboBox控件的适当成员。更改触发的事件是ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

当所选项目已更改并且在ComboBox中显示该更改时发生。

SelectedValue属性是从ListControl控件继承的。因此,此属性将触发ListControl.SelectedValueChanged事件。

ListControl.SelectedValueChanged

在SelectedValue属性更改时发生。

也就是说,他们不会解雇INotifyPropertyChangedPropertyChanged事件相同,但无论如何都会如此。唯一的区别是触发事件。SelectedValueChanged从组合框的列表部分中做出新选择后立即触发,并在组合框SelectedItemChanged的文本框部分中显示该项目时触发。

简而言之,它们都代表了ComboBox列表部分中的某些内容。因此,绑定任何一个属性时,结果都是相同的,因为PropertyChanged无论哪种情况都会触发该事件。并且由于它们都代表列表中的一个元素,因此它们可能会被视为相同。

这有帮助吗?

编辑#1

假设ComboBox的列表部分代表一个属性(由于我没有编写控件,所以我无法确认),绑定SelectedItemSelectedValue影响控件内的同一集合。然后,当更改此属性时,最后也会发生相同的情况。该INotifyPropertryPropertyChanged.PropertyChanged事件在同一媒体资源上触发。

2020-05-19