2011-06-17 75 views
3

我有一些绑定绑定到实体框架定义的对象。我的一些绑定更新正常,而其他绑定则不更新。解释的最好方法是通过一个例子,我有这样的事情:WPF绑定到实体框架不更新

<TextBlock Text="{Binding Path=FirstName}"/> 
<TextBlock Text="{Binding Path=LastName}"/> 
<TextBlock Text="{Binding Path=Role.Name}"/> 

在这种情况下,在第2周的TextBlocks文本精细只要对象的属性发生变化更新。在最后一个例子中没有任何反应。我可以看到为什么会发生这种情况。实体框架有一个属性RoleID,该属性正在更新,它正在引发RoleID的属性更改事件,但它不会引发Role的这种事件。所以绑定不知道什么改变了。我可以看到的可能解决方案是让实体框架在更改RoleID时为Role提升属性已更改事件,或者让绑定在RoleID而不是Role中查找更改。我不知道该如何做。

预先感谢任何答复, 迈克尔

回答

3

我找到了解决方案。正如杰里所说,实体对象需要提出一个属性改变的事件。问题是实体框架仅为RoleID引发事件,而不引发Role。我试图通过调用ReportPropertyChanged来提出我自己的事件,但是这给了一个错误,说该属性不存在。解决方法是调用OnPropertyChanged(“角色”)而不是ReportPropertyChanged。这可以在部分方法中完成,以便当角色ID被更改时,角色也会引发一个事件。像这样的东西

partial void OnRoleIDChanged() 
{ 
    OnPropertyChanged("Role"); 
} 
1

两件事情你应该知道:

  1. 如果你的类属性不执行INotifyPropertyChanged然后改到底层数据将不会反映在UI。

  2. 如果您没有将UpdateSourceTrigger = PropertyChanged添加到绑定中,则对UI的更改将不会反映在基础数据中(直到您离开该字段为止)。

我希望这有助于。

+1

谢谢杰里,这两个我已经知道。问题是实体框架实现了INotifyPropertyChanged,但仅为RoleID属性提升它,但不提供角色。因此,我的绑定不知道更新,因为它的绑定路径是Role.Name。关于设置UpdateSourceTrigger = PropertyChanged,这仅适用于文本框被更改但我使用只读元素(文本块),所以这不会帮助。当实体框架对象更新时,我需要触发对绑定的更新。 – MikeKulls 2011-06-19 23:38:00

+0

也许你可以把它标记为答案(根据你的后续答案)?谢谢。 – 2011-06-20 22:27:04