2010-12-22 6 views
1

Sagen wir, ich habe eine Klasse, nennen wir sie Eltern. Diese Klasse hat als Eigenschaft ein Objekt einer anderen Klasse, nennen wir es Child. Child hat eine Int-Eigenschaft-ID.WPF: ComboBox, Objekte basierend auf identifizierender Eigenschaft vergleichen

Nun basieren Instanzen dieser Klassen auf Zeilen in Datenbanktabellen.

Also sagen wir, Parent hat Child-Instanz mit ID = 4 und in meinem Programm wird eine Dropdown-Liste mit allen verfügbaren Child-Instanzen, so dass wir die Instanz in Parent ändern können.

Problem ist, dass wegen des schlechten Designs die Liste mit allen Kindobjekten zu einem anderen Anlass vom Kind innerhalb des Elternteils instanziiert wird. Selbst wenn sie beide ID = 4 haben, werden sie sie nicht als dasselbe Objekt erkennen natürlich ist es nicht).

Allerdings möchte ich immer noch das gleiche ID-Objekt als Standard für die ComboBox verwenden. Ich sollte irgendwie irgendwie auf die ID verweisen, aber ich bin ein bisschen langsam im dunklen Monat Dezember und ich sehe nicht, wie es geht, weil es immer noch das Objekt ist, das ich nicht nur int Wert setze. Hier

ist der XAML-Code:

<DataTemplate x:Key="EditTemplate" DataType="{x:Type data:Parent}"> 
     <ComboBox ItemsSource="{Binding ElementName=Panel, Path=DataContext.ChildList}" 
           SelectedItem="{Binding Path=Child, Mode=TwoWay}" 
           SelectedValuePath="ID" DisplayMemberPath="Name" /> 
</DataTemplate> 

Antwort

5

so, auch wenn sie beide ID = 4 wird es nicht als gleiche Objekt erkennen (weil es ist natürlich nicht)

Es klingt wie das Wurzelproblem Gleichheit ist, überschreiben Sie die notwendigen Methoden für das gegebene Kindobjekt, um die Definition der Gleichheit zu erreichen, die Ihren Bedürfnissen entspricht.

public override bool Equals(object obj) 
    { 
     Child other = obj as Child; 
     if(other == null) 
     { 
     return false; 
     } 

     return (this.Id == other.Id); 
    } 

    public override int GetHashCode() 
    { 
     return this.Id.GetHashCode(); 
    } 

    public static bool operator == (Child me, Child other) 
    { 
     return Equals(me, other); 
    } 

    public static bool operator != (Child me, Child other) 
    { 
     return Equals(me, other); 
    } 
+0

Hmm natürlich sollte das funktionieren. Ich suchte nach einer Lösung i XAML aber das sollte natürlich funktionieren und ist eleganter. –

3

Falls jemand kommt sonst über diese wieder und will, eine XAML-Lösung Sie auch die SelectedValuePath und SelectedValue Eigenschaft zusammen mit der SelectedItem-Eigenschaft verwenden können.

<DataTemplate x:Key="EditTemplate" DataType="{x:Type data:Parent}"> 
    <ComboBox ItemsSource="{Binding ElementName=Panel, Path=DataContext.ChildList}" 
          SelectedItem="{Binding Path=Child, Mode=TwoWay}" 
          SelectedValue="{Binding Path=Child.ID, Mode=OneWay}" 
          SelectedValuePath="ID" DisplayMemberPath="Name" /> 
</DataTemplate> 

HINWEIS: Offensichtlich ist dies nicht best practice zwei Bindungen an die Auswahl zu haben, also mit Vorsicht zu verwenden.

+0

Danke! Ich weiß nicht, wie es im Detail funktioniert, aber es funktioniert :-) – Endrju