我有一个Silverlight控件,它具有我的根ViewModel对象,因为它是数据源。 ViewModel公开了一张卡片列表以及一个SelectedCard属性,该属性绑定到视图顶部的下拉列表中。然后,我在底部显示SelectedCard的属性。我的XAML显示为(减少为简单起见):Silverlight 3数据绑定子属性不更新
<StackPanel Orientation="Vertical">
<ComboBox DisplayMemberPath="Name"
ItemsSource="{Binding Path=Cards}"
SelectedItem="{Binding Path=SelectedCard, Mode=TwoWay}"
/>
<TextBlock Text="{Binding Path=SelectedCard.Name}"
/>
<ListBox DisplayMemberPath="Name"
ItemsSource="{Binding Path=SelectedCard.PendingTransactions}"
/>
</StackPanel>
我希望将TextBlock和列表框更新,每当我选择在ComboBox一个新的项目,但事实并非如此。我相信这与TextBlock和ListBox实际绑定到SelectedCard的属性有关,因此它正在侦听该对象属性的属性更改通知。但是,我会认为数据绑定足够聪明,可以识别绑定表达式中的父对象已经更改并更新整个绑定。
它注意到PendingTransactions属性(绑定到ListBox)是延迟加载的。因此,我第一次在ComboBox中选择一个项目时,我会进行异步调用并加载列表和UI更新以显示与所选项目相对应的信息。但是,当我重新选择一个项目时,UI不会改变!
例如,如果我的原始列表包含三张卡片,则默认选择第一张卡片。数据绑定确实尝试访问该Card对象上的PendingTransactions属性并正确更新ListBox。如果我选择列表中的第二张卡片,则会发生同样的情况,并显示该卡片的PendingTransactions列表。但是,如果我再次选择第一张卡片,则在我的用户界面中没有任何变化!设置断点,我能够确认正在更新SelectedCard属性。
我该如何做这项工作?
这就是我唯一的例外,即Cards属性是ReadOnlyCollection,因为它不会改变。 – SonOfPirate 2010-04-19 16:07:56