繁体   English   中英

ComboBox SelectedItem与SelectedValue

[英]ComboBox SelectedItem vs SelectedValue

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

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

但是,以下方法的工作方式不同,并且在输入焦点移动到窗体上的另一个控件之前不会触发模型更新:

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

有人知道为什么吗? 我甚至不知道从哪里开始调查原因。 指向正确方向开始调查或直接解释的指针同样值得赞赏。

旁白 :为了我的目的,我最终绑定到SelectedItemSelectedValue 这样我就可以根据UI更改(通过SelectedValue绑定)获得即时模型更新,并根据程序模型更改(通过SelectedItem绑定)进行UI更新。

ComboBox控件继承自ListControl控件。

SelectedItem属性是ComboBox控件的正确成员。 在更改时触发的事件是ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

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

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

ListControl.SelectedValueChanged

SelectedValue属性更改时发生。

也就是说,他们不会触发INotifyPropertyChanged PropertyChanged事件相同,但无论如何他们都会。 唯一的区别在于射击事件。 SelectedValueChanged是一旦一个新的选择从组合框的列表部分作出解雇, SelectedItemChanged时显示在组合框的文本框部分的项目被解雇。

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

这有帮助吗?

编辑#1

假设ComboBox的列表部分表示属性(因为我没有写入控件而无法确认),所以SelectedItemSelectedValue绑定会影响控件内的同一个集合。 然后,当更改此属性时,最终会发生相同的情况。 INotifyPropertryPropertyChanged.PropertyChanged事件在同一属性上触发。

我怀疑ComboBox的SelectedItem属性在控件验证之前不会改变(控件失去焦点时会发生),而只要用户选择一个项目,SelectedValue属性就会改变。

以下是对控件发生的焦点事件的引用:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validated.aspx

如果你想让Selected.Value工作,你必须做以下事情:

1. Set DisplayMember
2. Set ValueMember
3. Set DataSource (not use Items.Add, Items.AddRange, DataBinding etc.)

关键点是Set DataSource!

根据我的经验,这是.NET中列表控件的长期“功能”。 就个人而言,我只是绑定到SelectedValue属性的更改并写入解决此“功能”所需的任何其他代码(例如具有两个属性,绑定到SelectedValue的一个,然后,在该属性的集合上,在自定义代码中更新SelectedItem中的值)。

无论如何,我希望help = D.

如果我们想要绑定到字典即

  <ComboBox SelectedValue="{Binding Pathology, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                              ItemsSource="{x:Static RnxGlobal:CLocalizedEnums.PathologiesValues}" DisplayMemberPath="Value" SelectedValuePath="Key"
                              Margin="{StaticResource SmallMarginLeftBottom}"/>

那么SelectedItem将无法使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM