2010-12-01 21 views
1

Ich habe drei ComboBoxen, so dass Cs Artikelliste abhängig von dem ausgewählten Artikel in B ist und Bs Artikelliste ist abhängig von dem ausgewählten Artikel in A. Ich habe ObservableCollection s insbesondere Klassen für die ItemsSource auf jeder ComboBox, und ich möchte die Name -Eigenschaft des ausgewählten Elements an eine Eigenschaft in einer anderen Klasse verschoben werden. Zum Beispiel:WPF - Cascading ComboBoxen, abhängige Updates nicht

ObservableCollection<AClass> Items 
=> ItemsSource of cbo_A ComboBox 

Und selectedInstanceOfAClass.Name sollte Data.AClassName Eigenschaft geschoben werden. Das Problem, das ich habe, ist, dass, wenn ich einen Wert in der A ComboBox das erste Mal wähle, die B ComboBox wie erwartet die entsprechenden Elemente basierend auf dem ausgewählten Element in A erhält. Dasselbe gilt für die Auswahl eines Gegenstandes in B zum ersten Mal - C bekommt die richtigen Gegenstände. Wenn ich jedoch einen anderen Wert in A wähle, werden die Elemente in B aktualisiert, aber der ausgewählte Wert von B bleibt gleich, und wenn ich versuche, aus den neuen Elementen einen neuen Wert in B auszuwählen, ändert sich die Auswahl nicht - -es bleibt gleich gewählten Wert als das, was ich ursprünglich in B. ausgewählt

Hier ist die XAML ich habe jetzt:

<ComboBox x:Name="cbo_A" 
    ItemsSource="{Binding Path=Lists.AItems, Mode=OneWay}" 
    DisplayMemberPath="Name" SelectedValuePath="Name" 
    SelectedValue="{Binding Path=Data.AClassName, ValidatesOnDataErrors=True, 
     Mode=OneWayToSource}" /> 

<ComboBox x:Name="cbo_B" 
    ItemsSource="{Binding ElementName=cbo_A, Path=SelectedItem.BItems, Mode=OneWay}" 
    SelectedValuePath="Name" DisplayMemberPath="Name" 
    SelectedValue="{Binding Path=Data.BClassName, ValidatesOnDataErrors=True, 
     Mode=OneWayToSource}"/> 

<ComboBox x:Name="cbo_C" 
    ItemsSource="{Binding ElementName=cbo_B, Path=SelectedItem.CItems, Mode=OneWay}" 
    SelectedValuePath="Name" DisplayMemberPath="Name" 
    SelectedValue="{Binding Path=Data.CClassName, Mode=OneWayToSource, 
     ValidatesOnDataErrors=True}" /> 

Was mit dem ausgewählten Wert das seltsame Verhalten verursacht nicht aktualisiert, auch wenn ich ausdrücklich Klicken Sie auf die ComboBox und versuchen Sie den Wert zu ändern?

Edit: beim Debuggen und ich hatte einen SelectionChanged Handler auf cbo_A und einem anderen auf cbo_B, trat ich in die cbo_B Handler vor den cbo_A ein, so dass das ausgewählte Element aus Sicht der B war noch der alte Artikel, weil A nicht gehabt wurde schon aktualisiert. :/

Edit 2: wenn ich die Reihenfolge meiner Comboboxen in XAML-Flip, von this question vorgeschlagen, so dass C vor B kommt, bevor A kommt, gebe ich A Handler zuerst. Wenn ich dann den Handler für cbo_B eingeben, zeigt die SelectedItem-Eigenschaft den alten Wert (zuvor ausgewählt, bevor ich einen neuen Wert in cbo_A wählte), obwohl ich einen Wert aus der neuen Liste der Elemente in der ComboBox angeklickt.

Bearbeiten 3: Ich bin eine Version von this answer versucht, und das gleiche Problem bekommen: Ich sehe neue Werte in ComboBox B auf den ausgewählten Wert von ComboBox A zu ändern, aber ich kann nicht den ausgewählten Wert in B, nachdem ich ändern habe es schon einmal eingestellt. Ich fange an zu denken, dass etwas anderes schief geht.

Antwort

1

Wow. Also, gehen Sie nicht schnell ein paar IEquatable<T>Equals Methoden für neue Klassen Umsetzung, weil Sie am Ende vielleicht zu tun, was ich getan habe:

if (ReferenceEquals(this, other)) 
{ 
    return false; // Say what?? 
} 

Sigh. Ich habe meine ComboBoxen zur Arbeit mit:

  • Korrigieren meiner BClass.Equals(BClass other) Methode;
  • Mit this answer über eine andere Ansicht Modellklasse mit anderen Eigenschaften wie SelectedAItem und AItems; und
  • Mit this answer über das Setzen meiner XAML-Deklarationen in einer anderen Reihenfolge, so cbo_C kommt vor cbo_B und cbo_B kommt vor cbo_A.

Ich kann versuchen, Dinge zu vereinfachen und sehen, welche Teile für meine ComboBoxes absolut notwendig sind.