以下代码按预期工作 - 当用户在下拉列表中选择新项目时,模型上的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更新。
答案 0 :(得分:38)
ComboBox
控件继承自ListControl
控件。
SelectedItem
属性是ComboBox
控件的正确成员。在更改时触发的事件是ComboBox.SelectionChangeCommitted
<强> ComboBox.SelectionChangeCommitted 强>
当所选项目发生更改并且组合框中显示更改时发生。
SelectedValue
属性继承自ListControl
控件。
因此,此属性将触发ListControl.SelectedValueChanged
事件。
<强> ListControl.SelectedValueChanged 强>
在SelectedValue属性更改时发生。
也就是说,他们不会同时发起INotifyPropertyChanged
。PropertyChanged
事件,但无论如何他们都会这样做。唯一的区别在于射击事件。只要从ComboBox的列表部分进行新选择就会触发SelectedValueChanged
,并且当项目显示在ComboBox的TextBox部分中时会触发SelectedItemChanged
。
简而言之,它们都代表了ComboBox列表部分的内容。因此,在绑定任一属性时,结果是相同的,因为在任何一种情况下都会触发PropertyChanged
事件。因为它们都代表了列表中的元素,所以它们可能被视为相同。
这有帮助吗?
编辑#1
假设ComboBox的列表部分代表一个属性(由于我没有编写控件而无法确认),SelectedItem
或SelectedValue
的绑定会影响同一个集合控制。然后,当更改此属性时,最终会发生相同的情况。 INotifyPropertryPropertyChanged.PropertyChanged
事件在同一个属性上触发。
答案 1 :(得分:5)
我怀疑ComboBox的SelectedItem属性在控件验证之前不会改变(控件失去焦点时会发生),而只要用户选择了一个项目,SelectedValue属性就会改变。
以下是对控件发生的焦点事件的引用:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validated.aspx
答案 2 :(得分:2)
根据我的经验,这是.NET中列表控件的长期“功能”。就个人而言,我只是绑定到SelectedValue属性的更改并写入解决此“功能”所需的任何其他代码(例如具有两个属性,绑定到SelectedValue的一个,然后,在该属性的集合上,在自定义代码中更新SelectedItem中的值。)
无论如何,我希望help = D
答案 3 :(得分:2)
如果您希望Selected.Value正常工作 你必须做以下事情:
1. Set DisplayMember
2. Set ValueMember
3. Set DataSource (not use Items.Add, Items.AddRange, DataBinding etc.)
关键点是Set DataSource!
答案 4 :(得分:1)
如果我们想绑定字典,即
<ComboBox SelectedValue="{Binding Pathology, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{x:Static RnxGlobal:CLocalizedEnums.PathologiesValues}" DisplayMemberPath="Value" SelectedValuePath="Key"
Margin="{StaticResource SmallMarginLeftBottom}"/>
然后SelectedItem将无法工作,其中