1

我将尝试尽可能简洁地解释这一点。我有 2 个对象,第一个我们称之为对象 A,它有一个 Id 属性,第二个我们称之为对象 B,它有一个 ParentId 属性。明显的关系是对象 B 的 ParentId 设置为对象 A 的 Id 属性。我正在使用 MVVM 模式,因此在视图模型上我有 2 个 ObservableCollections,一个包含对象 A 和其他对象 B。在构建视图模型时,我创建并填充名为 ListItems 的 ObservableCollection<'A'>。我的xaml很简单,

<StackPanel>
    <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ListItems}">
    </ListBox>

    <ComboBox SelectedValuePath="ParentId" SelectedValue="{Binding Path=ListItems/Id, Mode=OneWay}" ItemsSource="{Binding ComboItems}">
    </ComboBox>

    <Button Click="Button_Click" Content="Push Me"/>            
</StackPanel>

如您所见,组合框的 SelectedValue 绑定到 ListItems 当前项的 Id 属性。所以基本上列表框和组合框都在一个主细节中。

如果您按下按钮,它将填充 ObservableCollection<'B'> 名称 ComboItems,然后填充组合框。现在这里是奇怪的开始。当我启动程序时,如果我唯一要做的就是按下按钮,然后在列表框中选择一个项目,由于 SelectedValue 绑定,组合框将正确选择一个项目。但是如果我启动程序并首先在列表框中选择一个项目然后按下按钮,则当前组合框项目不会随着当前列表框项目而改变。绑定似乎永远被打破了。有谁知道为什么会这样?

附言。如果我在设置 SelectedValue/SelectedValuePath 之前在组合框上设置了 ItemsSource,则主/从绑定将永远无法工作。我知道 xaml 有顺序,但这似乎有点脆弱。因此,如果有人对此也有意见,我会全神贯注。

谢谢,内特

编辑 -

绑定 SelectedValue 时,非常脆弱。如果绑定有效,即没有在列表框中选择任何内容然后填充组合框,如果您在组合框中选择了一个项目,则绑定将中断。在为此浪费了很多时间之后,我选择了绑定 SelectedItem。在我之前指定的任何条件下,此绑定都不会中断。但是,对于为什么 SelectedValue 绑定如此荒谬,我会接受任何答案。再次感谢所有已回答或将要回答的人。

4

1 回答 1

2

是的,这是一个我们经常遇到的问题。

问题是ItemsSource属性获取新值后,SelectedValue绑定会被清除。糟透了,直到今天我们还没有找到合适的解决方案。

以下是一些解决方法:

  • 设置新的 ItemsSource 后立即重置SelectedValue代码中的绑定。您可以在转换器中执行此操作,或者在您知道哪个将替换 ItemsSource 绑定(如DataContextChanged事件)的地方执行此操作。

  • 尝试使用 a和过滤器,而不是使用Bindingon 。将所有项目放入对象中,并在组合框更改值时过滤项目。ItemsSourceCollectionViewSourceCollectionViewSource

  • SelectionChanged当您的列表框引发事件时,以老式方式手动获取您的项目。

请注意,所有解决方案都不是书中最漂亮的。我会选择选项 2,它是最干净的 IMO ;)

希望这可以帮助!

于 2010-01-12T16:07:46.363 回答