【问题标题】:WPF - cascading ComboBoxes, dependent ones don't updateWPF - 级联组合框,依赖的组合框不更新
【发布时间】:2010-12-01 17:14:46
【问题描述】:

我有三个组合框,因此 C 的项目列表取决于 B 中的选定项目,而 B 的项目列表取决于 A 中的选定项目。我在每个 ComboBox 上都有 ItemsSource 的特定类的 ObservableCollections ,并且我希望将所选项目的Name 属性推送到另一个类中的属性。例如:

ObservableCollection<AClass> Items
=> ItemsSource of cbo_A ComboBox

并且selectedInstanceOfAClass.Name 应该被推送到Data.AClassName 属性。我遇到的问题是,当我第一次在 A ComboBox 中选择一个值时,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}" />

是什么导致即使我明确单击 ComboBox 并尝试更改值,所选值也不会更新的奇怪行为?

编辑: 调试时,我在cbo_A 上有一个SelectionChanged 处理程序,在cbo_B 上有另一个处理程序,我在cbo_A 一个之前输入了cbo_B 处理程序,所以选中从 B 的角度来看,项目仍然是旧项目,因为 A 尚未更新。 :/

编辑 2:如果我按照this question 的建议在 XAML 中翻转 ComboBoxes 的顺序,使 C 在 B 之前在 A 之前,我首先进入 A 的处理程序。然后当我输入cbo_B 的处理程序时,SelectedItem 属性显示旧值(之前选择,在我在cbo_A 中选择新值之前),即使我从显示的新项目列表中单击了一个值在组合框中。

编辑 3: 我正在尝试 this answer 的版本并遇到同样的问题:在更改 ComboBox A 的选定值后,我在 ComboBox B 中看到了新值,但我无法更改在我已经设置一次之后在 B 中选择的值。我开始认为我还有其他问题。

【问题讨论】:

    标签: c# wpf data-binding xaml combobox


    【解决方案1】:

    哇。所以,不要为新类快速实现一堆IEquatable&lt;T&gt;Equals 方法,因为你最终可能会做我所做的:

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

    叹息。我让我的 ComboBoxes 工作:

    • 更正我的BClass.Equals(BClass other) 方法;
    • 使用this answer 表示拥有另一个具有不同属性的视图模型类,例如SelectedAItemAItems;和
    • 使用this answer 将我的XAML 声明以不同的顺序排列,因此cbo_C 位于cbo_B 之前,cbo_B 位于cbo_A 之前。

    我可能会尝试简化一些事情,看看哪些部分对于我的 ComboBox 是绝对必要的。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多