Combobox SelectedItem wird nicht aktualisiert, wenn sich die Quelle ändert

8

Ich habe ein Viewmodel, das INotifyPropertyChanged implementiert. Auf diesem viewModel ist eine Eigenschaft namens SubGroupingView . Diese Eigenschaft ist an das ausgewählte Element eines Kombinationsfelds gebunden. Wenn ich das Kombinationsfeld ändere, wird die Quelleigenschaft gut aktualisiert, aber wenn ich die Quelleigenschaft ändere oder wenn das Steuerelement initialisiert wird, spiegelt das combobox.selectedItem NICHT, was in der Eigenschaft existiert.
Hier ist ein Code, um loszulegen:

%Vor%

Die Eigenschaft löst das PropertyChanged -Ereignis aus und die TraceSource-Ausgabe zeigt mir, dass die Bindung es erkannt und den Wert übertragen hat, nur dass die Combobox es nicht reflektiert. Irgendwelche Ideen wären sehr willkommen!

BEARBEITEN:
Ausgabe von der Ablaufverfolgungsquelle ist dies:

%Vor%

Hier ist der Code für die Quelleigenschaft:

%Vor%

Hinweis: ViewModelBase implementiert INotifyPropertyChange .

ANTWORT
Ich habe die Operatoren ==,! =,% Co_de% und GetHashCode() überladen und jetzt funktioniert es gut. Vielen Dank für Ihre Hilfe!

    
TerrorAustralis 17.08.2010, 04:17
quelle

3 Antworten

15

Das von Ihrer SubGroupingView zurückgegebene Objekt muss einem der Objekte in der ComboBox.Items "gleich" sein (was bedeutet, dass es in Ihrer Columns-Auflistung sein muss). Wenn Sie also "a.Equals (b)" ausführen, müsste "true" zurückgegeben werden.

Wenn sie funktional gleich sind, aber im Vergleich nicht wahr sind, dann ist das dein Problem. Sie müssten entweder das gleiche Objekt zurückgeben oder die Equals-Methode (und möglicherweise die Operatoren == und! =) Überschreiben.

Wenn dies Ihr Problem ist, ist es das gleiche Problem wie in dieser Frage .

    
CodeNaked 20.08.2010, 00:47
quelle
3

Ist IsSynchronizedWithCurrentItem auf Ihrem ComboBox vielleicht auf false gesetzt? Du könntest versuchen, IsSynchronizedWithCurrentItem="True" explizit zu setzen und zu sehen, ob das hilft.

    
Zach Johnson 17.08.2010 05:00
quelle
0

Die Antwort von @CodeNaked ist richtig. Aber in meinem Fall löst das Überschreiben von Object.Equals StackOverflowException aus. Ich denke, die ganze Antwort besteht darin, ein vollständiges IEquatable zu implementieren, das heißt, seine Equals-Methode zu implementieren und die Methoden Object.Equals (Object) und Object.GetHashCode wie in dieses Beispiel (siehe das Ende des Abschnitts" Bemerkungen "-" Hinweise zu Implementierern "- und" Beispiele ").

    
Alex34758 26.07.2016 12:59
quelle