WPF中的奇数绑定行为

时间:2010-01-12 15:54:55

标签: wpf binding combobox master-detail selectedvalue

我会尽可能简洁地解释这一点。我有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绑定是如此荒谬。再次感谢所有已经回答或将要回答的人。

1 个答案:

答案 0 :(得分:2)

是的,这是一个我们偶然发现的问题。

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

以下是一些解决方法:

  • 一旦设置了新的ItemsSource,就重置代码中的SelectedValue绑定。您可以在转换器中执行此操作,或者您将知道哪些将替换ItemsSource绑定(如DataContextChanged事件)。

  • 不要使用Binding上的ItemsSource,而是使用CollectionViewSource和过滤器。将所有项目放在CollectionViewSource对象中,并在组合框更改值时过滤项目。

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

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

希望这有帮助!