【发布时间】: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