我会尽可能简洁地解释这一点。我有2个对象,第一个我们称之为具有Id属性的对象A,第二个我们将调用对象B,它具有ParentId属性。明显的关系是对象B的ParentId被设置为对象A的Id属性。我正在使用MVVM模式,所以在viewmodel上我有2个ObservableCollections,一个包含对象A其他对象B.在构建viewmodel时,我创建并填充ObservableCollection<'A'>名为ListItems。我的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&lt;'B'&gt;命名ComboItems,它反过来填充组合框。现在这里是奇怪的开始。当我启动程序时,如果我唯一要做的就是按下按钮,然后在列表框中选择一个项目后,组合框将根据SelectedValue绑定正确选择一个项目。但是,如果我启动程序并首先在列表框中选择一个项目,然后按下按钮,当前的组合框项目将不会随当前列表框项目而改变。绑定似乎永远被打破。有谁知道为什么会这样?
聚苯乙烯。如果我在设置SelectedValue / SelectedValuePath之前在组合框上设置ItemsSource,则主/详细绑定将永远不会起作用。我知道xaml有秩序,但这似乎有点脆弱。所以,如果有人也对此提出意见,我全都听见了。
谢谢,Nate
编辑 -
绑定SelectedValue时,它非常脆弱。如果绑定正在工作,即没有在列表框中选择任何内容然后填充组合框,如果您在组合框中选择一个项目,绑定将会中断。经过很长时间的浪费,我选择绑定SelectedItem。在我之前指定的任何条件下,此绑定不会中断。然而,我会回答为什么SelectedValue绑定是如此荒谬。再次感谢所有已经回答或将要回答的人。
答案 0 :(得分:2)
是的,这是一个我们偶然发现的问题。
问题是在ItemsSource
属性获取新值后,SelectedValue
绑定将被清除。糟透了,直到今天我们还没有找到合适的解决方案。
以下是一些解决方法:
一旦设置了新的ItemsSource,就重置代码中的SelectedValue
绑定。您可以在转换器中执行此操作,或者您将知道哪些将替换ItemsSource绑定(如DataContextChanged
事件)。
不要使用Binding
上的ItemsSource
,而是使用CollectionViewSource
和过滤器。将所有项目放在CollectionViewSource
对象中,并在组合框更改值时过滤项目。
当您的列表框引发SelectionChanged
事件时,以旧时尚的方式手动获取您的项目。
请注意,所有解决方案都不是本书中最漂亮的。我会选择2,它是最干净的IMO;)
希望这有帮助!