2010-05-21 14 views
40

Der folgende Code funktioniert wie erwartet - MyProperty auf dem Modell wird aktualisiert, wenn der Benutzer ein neues Element im Dropdown auswählt.ComboBox SelectedItem vs SelectedValue

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

Die folgenden, funktioniert jedoch nicht die gleiche Art und Weise und das Modell-Update wird erst in den Eingabefokus bewegt sich zu einem anderen Steuerelement auf dem Formular ausgelöst:

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

Weiß jemand, warum ? Ich weiß nicht einmal, wo ich anfangen soll, die Ursache zu untersuchen. Zeiger in die richtige Richtung, um die Untersuchung zu beginnen oder eine direkte Erklärung würden gleichermaßen geschätzt werden.

Beiseite: für meine Zwecke endete ich Bindung an beide SelectedItem und SelectedValue. Auf diese Weise erhalte ich sofortige Modellaktualisierungen basierend auf UI-Änderungen (über die SelectedValue-Bindung) und UI-Aktualisierungen basierend auf programmatischen Modelländerungen (über die SelectedItem Bindung).

Antwort

36

Die ComboBox Steuer erbt von der ListControl Kontrolle.

Die SelectedItem-Eigenschaft ist ein ordnungsgemäßes Mitglied der ComboBox-Steuerung. Das Ereignis, das auf Änderung gefeuert wird, ist ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

Tritt ein, wenn das ausgewählte Element geändert hat und diese Änderung in der ComboBox angezeigt.

Die SelectedValue-Eigenschaft wird von der ListControl-Steuerung übernommen. Als solche wird diese Eigenschaft das Ereignis ListControl.SelectedValueChanged auslösen.

ListControl.SelectedValueChanged

Tritt ein, wenn die SelectedValue Eigenschaft ändert.

Das heißt, sie werden nicht die INotifyPropertyChanged feuern.PropertyChanged Ereignis gleich, aber sie werden sowieso. Der einzige Unterschied liegt im Feuerereignis. SelectedValueChanged wird ausgelöst, sobald eine neue Auswahl aus dem Listenteil der ComboBox getroffen wird, und SelectedItemChanged wird ausgelöst, wenn das Element im TextBox-Teil der ComboBox angezeigt wird.

Kurz gesagt, sie repräsentieren beide etwas im Listenteil der ComboBox. Wenn also eine Eigenschaft gebunden wird, ist das Ergebnis dasselbe, da das Ereignis PropertyChanged in beiden Fällen ausgelöst wird. Und da sie beide ein Element aus der Liste darstellen, werden sie wahrscheinlich gleich behandelt.

Hilft das?

EDIT # 1

Unter der Annahme, dass die Liste Teil der ComboBox eine Eigenschaft darstellt (wie kann ich nicht bestätigen, da ich nicht die Kontrolle geschrieben hat), die Bindung entweder von SelectedItem oder SelectedValue die gleiche beeinflusst Sammlung innerhalb der Kontrolle. Wenn diese Eigenschaft geändert wird, tritt dasselbe am Ende auf. Das Ereignis INotifyPropertryPropertyChanged.PropertyChanged wird für dieselbe Eigenschaft ausgelöst.

2

Dies ist ein langjähriges "Feature" der Listensteuerelemente in .NET meiner Erfahrung nach. Persönlich würde ich nur an die Änderung der SelectedValue -Eigenschaft binden und schreiben, was auch immer zusätzlichen Code zur Umgehung dieser "Feature" (wie zwei Eigenschaften, Bindung an eine für SelectedValue, und dann auf der Menge dieser Eigenschaft notwendig ist) Aktualisieren des Werts von SelectedItem in Ihrem benutzerdefinierten Code).

Wie dem auch sei, ich hoffe, das hilft = D

+1

ich am Ende zwei Bindungen einrichten - ein bis SelectedValue und ein bis SelectedItem und didn‘ Ich brauche darüber hinaus einen benutzerdefinierten Code. :) –

+0

@Anna Froh zu hören, dass Sie es funktioniert :) –

5

Ich vermute, dass die SelectedItem-Eigenschaft des ComboBox ändert sich erst, wenn die Steuerung überprüft wurde (die auftritt, wenn das Steuerelement den Fokus verliert), während die SelectedValue Eigenschaft ändert, wenn der Benutzer wählt einen Gegenstand aus. Hier

ist ein Hinweis auf die Fokus-Ereignisse, die auf Kontrollen auftreten:

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

+0

Eine bessere Antwort als meine. Es ist auch wichtig darauf hinzuweisen, dass Sie SelectedItem nicht verwenden können, wenn es an SelectedValue gebunden ist, da es noch nicht aktualisiert wurde. Wenn ich mich richtig erinnere, müssen Sie aus der Items-Auflistung des Listensteuerelements SelectedIndex abrufen. –

1

WENN Sie möchten, dass Selected.Value Arbeit ist brauchen folgende

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

Der entscheidende Punkt ist Datasource Set!

0

Wenn wir in ein Wörterbuch binden wollen also

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

dann wird SelectedItem nicht funktionieren whilist SelectedValue wird

Verwandte Themen