2010-05-21 80 views
40

以下代码正如您所料 - 当用户在下拉菜单中选择新项目时,模型上的MyProperty会更新。ComboBox SelectedItem vs SelectedValue

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

以下,但是,不相同的方式工作和型号更新不会被触发,直到输入焦点移动到另一个控件的形式:

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

有谁知道为什么?我甚至不知道从哪里开始调查原因。同样赞赏指向正确的方向开始调查或彻底解释。

Aside:出于我的目的,我结束了对SelectedItemSelectedValue的约束。这样,我可以基于UI更改(通过绑定SelectedValue)获取即时模型更新,并根据程序化模型更改(通过SelectedItem绑定)获取UI更新。

回答

36

ListControl控制的ComboBox控件继承。

SelectedItem属性是ComboBox控件的正确成员。这是在变动触发事件是ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

时所选择的项目更改后发生和变化显示在组合框。

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

ListControl.SelectedValueChanged

发生SelectedValue属性更改时。

也就是说,他们不会触发INotifyPropertyChangedPropertyChanged事件一样,但他们会反正。唯一的区别是在射击事件。一旦从ComboBox的列表部分进行了新选择,就会触发SelectedValueChanged,并且在ComboBox的TextBox部分中显示该项目时触发SelectedItemChanged

总之,它们都代表ComboBox的列表部分。因此,在绑定任一属性时,结果是相同的,因为在任何情况下都会触发PropertyChanged事件。既然它们都代表了列表中的一个元素,那么它们可能会被视为相同。

这有帮助吗?

EDIT#1

假设ComboBox的列表部分代表一个属性(如我无法证实,因为没写控制),结合任一或SelectedItem影响SelectedValue相同在控制内收集。然后,当这个属性改变时,最后也会发生同样的情况。该事件在同一个属性上触发。

2

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

无论如何,我希望帮助= d

+1

我结束了设立两个绑定 - 一个的SelectedValue和一个的SelectedItem和没”除此之外,还需要任何自定义代码。 :) – 2010-05-21 17:01:58

+0

@Anna很高兴听到你有它的工作:) – 2010-05-21 17:45:13

5

我怀疑ComboBox的SelectedItem属性不会改变,直到控制已经被验证(这当控件失去焦点时发生),而SelectedValue属性的变化,只要用户选择一个项目。

下面是关于控制所发生的焦点事件的引用:

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

+0

比我更好的答案。指出在绑定到SelectedValue时您将无法使用SelectedItem,因为它不会被更新也很重要。如果我没有记错,您必须使用SelectedIndex的列表控件的Items集合中的检索。 – 2010-05-21 16:04:07

1

如果您希望Selected.Value是工作 需要做以下

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

关键的一点是设置数据源!

0

如果我们要绑定到一本字典,即

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

那么的SelectedItem将无法正常工作whilist的SelectedValue将