2010-12-01 93 views
1

我有三个组合框,这样C的项目列表取决于B中的选定项目,B的项目列表取决于A中的选定项目。我有ObservableCollection s每个组合框上的ItemsSource的类,并且我希望将所选项的Name属性推送到另一个类中的属性。例如:WPF级联组合框,从属组合框不更新

ObservableCollection<AClass> Items 
=> ItemsSource of cbo_A ComboBox 

而且selectedInstanceOfAClass.Name应该推到Data.AClassName财产。我遇到的问题是,当我第一次在A组合框中选择一个值时,B ComboBox会根据预期的A中所选项目获取适当的项目。当我第一次在B中选择一个项目时 - C获得正确的项目时也是如此。但是,当我在A中选择一个不同的值时,B中的项目会更新,但B的选定值保持不变,当我尝试从新项目中选择B中的新值时,选择不会更改 - - 它保持不变选择的值作为我在B.初步选定

这里的XAML我现在所拥有的:

<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}" /> 

什么导致与所选值不更新,甚至当我明确了怪异的行为单击组合框并尝试更改值?

编辑:调试和我有一个SelectionChanged处理器上cbo_A,另一个在cbo_B的时候,我进入了cbo_B处理程序cbo_A人之前,所以从B的角度来看,选择的项目仍然是老项目,因为A有没有已更新。 :/

编辑2:如果我翻我的XAML组合框,通过this question建议,顺序,以使得C到来之前B来到A之前,我先输入的处理程序。当我然后输入cbo_B的处理程序时,SelectedItem属性显示旧值(先前选择,在我选择cbo_A中的新值之前),即使我单击了ComboBox中显示的新项目列表中的值。

编辑3:我想一个版本的this answer并得到了同样的问题:我在改变组合框A的选定值看在ComboBox中乙新的价值,但在我,我不能改变B中选择的值已经设置了一次。我开始觉得我还有其他的东西会出错。

回答

1

哇。所以,不要去迅速实现了一堆IEquatable<T>Equals方法新的类,因为你可能会做什么,我所做的:

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

叹息。我有我的ComboBoxes工作:

  • 更正我的BClass.Equals(BClass other)方法;
  • 使用this answer有关具有不同属性的另一视图模型类,如SelectedAItemAItems;和
  • 使用this answer将我的XAML声明放入不同的顺序,所以cbo_Ccbo_B之前,cbo_Bcbo_A之前。

我可能会尝试简化一些事情,看看哪些部件是我的ComboBoxes绝对必需的。