C #, .NET 4.0, VS2010.
Neu bei WPF. Ich habe eine ComboBox in meinem MainWindow. Ich habe das SelectionChanged-Ereignis dieses Kombinationsfelds verknüpft. Wenn ich jedoch den Wert des Kombinationsfelds im Ereignishandler untersuche, hat es den alten Wert. Dies klingt eher nach einem "SelectionChanging" -Ereignis als nach einem SelectionChanged-Ereignis.
Wie erhalte ich den neuen Wert der ComboBox, nachdem die Auswahl tatsächlich erfolgt ist?
Zur Zeit:
this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);
...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = this.MyComboBox.Text;
}
Beachten Sie, dass ich das gleiche Verhalten erhalte, wenn ich das Objekt verwende, das in den Ereignisargumenten egeOriginalSource übergeben wird.
SelectionChanging
?Antworten:
Laut MSDN
e.AddedItems
:Sie könnten also verwenden:
Sie können auch verwenden ,
SelectedItem
wenn Sie verwendenstring
Werte für dieItems
von dersender
:oder
Da beide
Content
undSelectedItem
sind Objekte, wäre ein sicherer Ansatz zu verwenden ,.ToString()
stattas string
quelle
ComboBox.SelectedItem
hat keine Eigenschaft namensText
, aber Sie können tunComboBox.SelectedItem as string
(obwohl dies möglicherweise nur funktioniert, wenn Siestring
für dieItems
- nichts anderes getestet)Der richtige Wert, der hier überprüft werden muss, ist die SelectedItem- Eigenschaft.
Eine ComboBox ist ein zusammengesetztes Steuerelement, dessen zwei Teile sind:
Das obige Bild wurde unmittelbar nach dem Erweitern der ComboBox (dh vor der Auswahl eines neuen Werts) aufgenommen. Zu diesem Zeitpunkt sind sowohl Text als auch SelectedItem "Info", vorausgesetzt, die ComboBox-Elemente waren Zeichenfolgen. Wenn die ComboBox-Elemente stattdessen alle Werte einer Aufzählung mit dem Namen "LogLevel" wären , wäre SelectedItem derzeit LogLevel.Info .
Wenn Sie auf ein Element in der Dropdown-Liste klicken, wird der Wert von SelectedItem geändert und das SelectionChanged- Ereignis ausgelöst. Der Text Eigenschaft ist noch nicht aktualisiert, obwohl, wie der Text Teil aktualisiert wird erst nach dem Selectionhandler beendet ist. Dies kann beobachtet werden, indem ein Haltepunkt in den Handler gesetzt und die Steuerung betrachtet wird:
Da der Text Teil nicht an dieser Stelle aktualisiert hat, der Text gibt Eigenschaft den zuvor ausgewählten Wert.
quelle
Verwenden Sie das DropDownClosed-Ereignis anstelle von selectionChanged, wenn Sie den aktuellen Wert des Kombinationsfelds anzeigen möchten.
Ist wirklich so einfach.
quelle
Das hat bei mir funktioniert:
quelle
Das hat bei mir funktioniert:
quelle
sender
die richtige enthältSelectedItem
.Das folgende Ereignis wird für jede Änderung des Texts in der ComboBox ausgelöst (wenn der ausgewählte Index geändert wird und wenn der Text auch durch Bearbeiten geändert wird).
quelle
quelle
Die zweite Option hat bei mir nicht funktioniert, da das .Text-Element außerhalb des Gültigkeitsbereichs lag (C # 4.0 VS2008). Das war meine Lösung ...
quelle
Ich musste dies in VB.NET lösen. Folgendes scheint zu funktionieren:
quelle
Es ist seltsam, dass SelectedItem die frischen Daten enthält, SelectedValue jedoch nicht. Klingt für mich nach einem Fehler. Wenn Ihre Elemente in der Combobox andere Objekte als ComboBoxItems sind, benötigen Sie Folgendes: (my
ComboBox
enthältKeyValuePair
s)ComboBox.SelectedItem
kann null sein, während Visual Studio mir immer wieder sagt, dass aKeyValuePair
nicht null sein kann. Deshalb habe ich dasSelectedItem
auf nullable gesetztKeyValuePair<string, string>?
. Dann überprüfe ich, obselectedItem
es einen anderen Wert als hatnull
. Dieser Ansatz sollte auf jeden Typ Ihres ausgewählten Elements anwendbar sein.quelle
Wenn Sie das
SelectionChanged
Ereignis wirklich brauchen , ist die beste Antwort die Antwort von SwDevMan81. Wenn Sie jedoch mit WPF beginnen, möchten Sie möglicherweise lernen, wie Sie Dinge auf WPF-Weise tun. Dies unterscheidet sich von den alten Windows Forms-Tagen, in denen Ereignisse wieSelectionChanged
WPF und Model View ViewModel verwendet wurden Verwenden Sie Bindungen. Hier ist ein Codebeispiel:quelle
Die Verwendung von
e.AddedItems[0] as kProject
where kProject ist eine Klasse, die die für mich bearbeiteten Daten enthält, da standardmäßig RemovedItems [0] verwendet wurde, bevor ich diese explizite Unterscheidung getroffen habe. Vielen Dank an SwDevMan81 für die ersten Informationen, die diese Frage für mich beantwortet haben.quelle
Komplizieren Sie die Dinge nicht ohne Grund. Mit der SelectedValue-Eigenschaft können Sie auf einfache Weise einen ausgewählten ComboBox-Wert wie folgt abrufen: YourComboBoxName.SelectedValue.ToString ().
Hinter den Kulissen ist die SelectedValue-Eigenschaft wie folgt definiert: SelectedValue {get; set;} Dies bedeutet, dass Sie damit den Wert einer ComboBox abrufen oder festlegen können.
Die Verwendung von SelectedItem ist kein effizienter Weg, um einen ComboBox-Wert zu erhalten, da viele Konsequenzen erforderlich sind.
quelle
Sie können die SelectedIndex- oder SelectedValue- oder SelectedItem-Eigenschaft im SelectionChanged-Ereignis des Combobox-Steuerelements überprüfen.
quelle
Das sollte für Sie funktionieren ...
quelle
Ich habe dieses Problem mithilfe des DropDownClosed-Ereignisses gelöst, da es nach dem Ändern des Werts leicht ausgelöst wird.
quelle