comboboxSelectedItem VS SelectedValue
下面的代码就像你所期望的那样工作 – 当用户在下拉菜单中select一个新项目时,模型上的MyProperty
被更新。
comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true, DataSourceUpdateMode.OnPropertyChanged);
但是,以下方法的工作方式不同,只有input焦点移动到窗体上的另一个控件时,才会触发模型更新:
comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true, DataSourceUpdateMode.OnPropertyChanged);
有人知道为什么吗? 我甚至不知道从哪里开始调查原因。 指出正确的方向开始调查或彻底解释将同样赞赏。
另外 :为了我的目的,我结束了SelectedItem
和SelectedValue
。 这样,我可以基于UI更改(通过SelectedValue
绑定)获取即时模型更新,以及基于编程模型更改(通过SelectedItem
绑定)的UI更新。
ComboBox
控件inheritance自ListControl
控件。
SelectedItem
属性是ComboBox
控件的正确成员。 更改时触发的事件是ComboBox.SelectionChangeCommitted
ComboBox.SelectionChangeCommitted
在所选项目已更改并且该更改显示在combobox中时发生。
SelectedValue
属性从ListControl
控件inheritance。 因此,这个属性将触发ListControl.SelectedValueChanged
事件。
ListControl.SelectedValueChanged
在SelectedValue属性更改时发生。
也就是说,他们不会触发INotifyPropertyChanged
。 PropertyChanged
事件是一样的,但反正他们会。 唯一的区别是在射击事件。 SelectedValueChanged
只要从ComboBox的列表部分进行新select,就会触发,而SelectedItemChanged
在ComboBox的TextBox部分中显示该项目时触发。
总之,它们都代表ComboBox的列表部分。 所以,当绑定任何一个属性时,结果都是一样的,因为在任何一种情况下都会触发PropertyChanged
事件。 而且既然它们都代表了列表中的一个元素,那么它们可能也是一样的。
这有帮助吗?
编辑#1
假设ComboBox的列表部分表示一个属性(因为我不能确认,因为我没有写控件), SelectedItem
或SelectedValue
绑定会影响控件中的同一个集合。 然后,当这个属性改变时,最后也会发生同样的情况。 INotifyPropertryPropertyChanged.PropertyChanged
事件触发在同一个属性上。
我怀疑ComboBox的SelectedItem属性不会更改,直到控件已validation(这发生控件失去焦点时),而SelectedValue属性更改,只要用户select一个项目。
以下是对控件上发生的焦点事件的引用:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validated.aspx
在我的经验中,这是.NET中列表控件的一个长期“function”。 就个人而言,我只是绑定到SelectedValue属性的变化,并写任何其他代码是必要的解决这个“function”(如有两个属性,绑定到一个SelectedValue,然后,在该属性的集合,在您的自定义代码中更新SelectedItem中的值)。
无论如何,我希望帮助= D
如果你想Selected.Value是工作需要做以下事情
1. Set DisplayMember 2. Set ValueMember 3. Set DataSource (not use Items.Add, Items.AddRange, DataBinding etc.)
关键是Set DataSource!
如果我们要绑定到一个字典即
<ComboBox SelectedValue="{Binding Pathology, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{x:Static RnxGlobal:CLocalizedEnums.PathologiesValues}" DisplayMemberPath="Value" SelectedValuePath="Key" Margin="{StaticResource SmallMarginLeftBottom}"/>
那么SelectedItem将不适用于SelectedValue