WPF绑定到实体框架不更新

3

我有一些绑定,它们绑定到由实体框架定义的对象。我的某些绑定可以更新,而其他绑定则无法更新。最好的解释方式是通过一个例子,我有这样一个东西:

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

在这种情况下,只要更改对象的属性,前两个文本块中的文本就会更新。在最后一个文本块的情况下,没有任何反应。我知道为什么会发生这种情况。实体框架具有RoleID属性,该属性正在更新并引发RoleID的属性更改事件,但据我所知,它不会为Role引发此类事件。因此,绑定不知道已更改任何内容。我能想到的可能解决方案是让实体框架在更改RoleID时引发Role的属性更改事件,或者让绑定查找RoleID而不是Role的更改。我不确定如何执行其中任何一项解决方案。
提前感谢任何回复, 迈克尔
2个回答

3

我找到了一个解决方案。正如Jerry所说,实体对象需要引发属性更改事件。问题在于实体框架只为RoleID而不是Role引发事件。我试图通过调用ReportPropertyChanged来引发自己的事件,但是这会出现错误,指出该属性不存在。解决方案是调用OnPropertyChanged("Role")而不是ReportPropertyChanged。这可以在一个部分方法中完成,以便在RoleID更改时也会为角色引发事件。像这样:

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

1

你需要知道两件事情:

  1. 如果你的类属性没有实现INotifyPropertyChanged接口,那么对底层数据的更改将不会反映在UI上。

  2. 如果你没有在绑定中添加UpdateSourceTrigger=PropertyChanged,那么UI的更改将不会反映在底层数据中(直到你离开该字段)。

希望这可以帮助你。


1
谢谢Jerry,我已经知道这两个。问题是实体框架实现了INotifyPropertyChanged,但只为RoleID属性而不是Role引发它。因此,我的绑定不知道要更新,因为它的绑定路径是Role.Name。关于设置UpdateSourceTrigger = PropertyChanged,这仅适用于当文本框更改时,但我正在使用一个只读元素(textblock),所以这并没有帮助。我需要在实体框架对象更新时触发对我的绑定的更新。 - MikeKulls
也许您可以将此标记为答案(根据您下面的跟进答案)?谢谢。 - Jerry Nixon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接