Laden...

Comparer für ComboBox wenn man SelectedItem per Binding setzt

Erstellt von Quaneu vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.773 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 11 Jahren
Comparer für ComboBox wenn man SelectedItem per Binding setzt

Hallo nochmals,

alle guten Dinge sind 3 🙂

ich habe z.B. eine ComboBox, die ich per Binding "bediene":


<ComboBox ItemsSource="{Binding Modi}" SelectedItem="{Binding Modus}"/>

SelectedItem benutzt Equals() von dem jeweiligen Objekt. Doch liefert Equals() in machen Fällen ein falsches Ergebnis, daher arbeite ich mit IEqualityComparer<T> oder IComparer<T>.

Wie schaffe ich es, dass nun nicht mehr Equals() benutzt wird zum selektieren sondern ein beliebiger IEqualityComparer<T> oder IComparer<T>?

Schöne Grüße
Quaneu

6.862 Beiträge seit 2003
vor 11 Jahren

Hallo,

in was für Fällen soll das Ergebniss falsch sein? Das Ergebniss ist halt so, wie Equals implementiert ist. Wenn man Wertetypen hat, oder Referenztypen die sich wie Wertetypen verhalten (wie z.B. string), dann kann man die so nicht einsetzen in Binding Szenarien. Wenn man zwei Objekte von Werttypen anlegt mit gleichen Eigenschaftswerten, dann sind diese gleich, da kann man mit Equals die Objekte nicht mehr auseinander halten. Wenn man z.B. direkt eine StringCollection bindet, welche 3 mal "Hans" enthält und setzt das SelectedItem auf "Hans", dann ist es purer Zufall welches der 3 Items ausgewählt wird.

Was für Typen bindest du denn? Wenn du die selber erstellt hast, musst du halt Equals wie gewünscht überschreiben.

Baka wa shinanakya naoranai.

Mein XING Profil.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 11 Jahren

Also ich habe Referenztypen.
Im normalen Modus kann man die Objekte an Hand einer Uuid vergleichen, doch gibt es Modi im Programm, da kann man sich auf diese nicht mehr verlassen. Leider habe ich auf dieses Verhalten keinen Einfluss (ist meine "Vorgabe") .
Dies bedeutet, dass je nach Modus im Programm andere Eigenschaften als Vergleichskriterium dienen können. Und daraus ergibt sich für mich nun dieses Problem.

5.742 Beiträge seit 2007
vor 11 Jahren

Hallo Quaneu,

ich sehe ehrlich gesagt das Problem nicht so genau:
Du packst x Objekte in eine Collection und der User wählt eins davon aus. Dieses Item ist dann das SelectedItem.
Mit welchen anderen Items dieses dann evtl. noch "übereinstimmt" (d.h. Equals true liefert), ist in diesem Falle doch recht egal; über das Binding wird das ausgewählte geschrieben.

Anders sieht es höchstens aus, wenn du im Code das Item setzt: Da kann dann - mit fehlerhafter Implementierung von Equals der Fall auftreten, dass nicht eindeutig bestimmbar ist, welches Item nun tatsächlich von der Combobox ausgewählt wird.

In diesem Fall hilft (wie eigentlich immer in der WPF 😉 ) das MVVM-Pattern weiter:
Binde nicht direkt die Model-Klassen (auf die du ja keinen Einfluss zu haben scheinst) an das View, sondern schiebe ein ViewModel dazwischen.
Dann greift wieder die standardmäßige (d.h. Objektbezogene) Equals-Implementierung für die ViewModels und du hast keinerlei Probleme mehr.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 11 Jahren

Anders sieht es höchstens aus, wenn du im Code das Item setzt.

Das ist leider der Fall. Equals wurde nicht überschrieben, da es immer auf die Situation ankommt, wann etwas gleich ist.

Ich habe jetzt einen Wrapper (ViewModel) für diese Klassen geschrieben und das klappt wunderbar.

Vielen Dank für eure Hilfe
Quaneu