2010-05-21 361 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將