在生成的Entity Framework类上实现INotifyPropertyChanged

17

我有一个SQL数据库,并正在实现一个WPF UI来更新它。如果我使用EF5从数据库生成类,那么如何在生成的类和属性上实现INotifyPropertyChanged,以便我可以轻松地将它们与UI绑定?是否有一种简单的方法来实现这个?

谢谢

5个回答

14
如果您按照WPF的推荐MVVM模式操作,可以将生成的类视为Model,然后编写实现INotifyPropertyChanged的ViewModel包装器。 ViewModel类将访问您的DB类并公开属性,您可以在XAML中将其绑定到UI上。
正如您在评论中指出的那样,这可能会导致大量编写样板代码,但有一些方法可以解决这个问题。请参见此问题以获取一些想法。
虽然一开始需要更多的工作,但是如果您需要进行任何中间格式化或处理,或者如果您需要更改数据库类而不影响UI,则MVVM模式绝对能够长期收益。

1
例如,如果我生成了class Asset { public int id {get;set;} },我会编写class AssetWrap : Asset, INotifyPropertyChanged { public int idNotify { get { return id; } set{ id=value; NotifyPropertyChanged();} }} 如果是这样,那么看起来非常耗时。 - Steve
2
通常情况下,ViewModel 不会继承 Model,而是拥有一个包含 Model 对象的字段,类似于 class AssetWrap : INotifyPropertyChanged { private Asset _asset; public int idNotify { get { return _asset.id; } set{ _asset.id=value; NotifyPropertyChanged();} }(这并不完整)。是的,有时候使用 MVVM 模式会导致很多乏味的样板代码,但如果需要进行一些中间处理或更改模型的显示方式,它确实会产生回报。我在下面放了一个链接,里面有一些减少这种工作量的想法。 - WildCrustacean
我能看出MVVM的好处,但他们真的需要一些MVVM生成器,因为很多时候都是按照相同的模板进行操作。 - Steve
1
我知道有一些MVVM框架和一些单独的生成器(比如这个),但我无法确切地评价它们的质量。 - WildCrustacean
1
标准的MVVM方法存在一个问题,即如果从VM更新模型,则UI不会得到更新,因为它不知道模型的变化。 - jamesSampica
同意shoe的观点,从模型继承以创建新的视图模型是一件痛苦的事情。 - user1841243

9

有一个名为PropertyChanged.Fody的NuGet包,它使将INotifyPropertyChanged添加到类属性变得非常简单。一旦安装了该包,只需将[ImplementPropertyChanged]属性添加到任何类或部分类中,该包就会自动为您添加INotifyPropertyChanged。

这里是一个简单的示例:

using PropertyChanged;

[ImplementPropertyChanged]
public partial class Order
{
}

请查看GitHub获取更多相关信息。


4
ๆ›ดๆ–ฐ๏ผšImplementPropertyChanged ๅทฒ่ขซ AddINotifyPropertyChangedInterface ๅ–ไปฃใ€‚ - Midas

6

最近我需要使用Winforms完成同样的任务。如果你不想像bde建议的那样遵循MVVM模式,你可以修改t4模板,在生成的实体上实现INotifyPropertyChanged。

这个答案对我很有帮助:https://dev59.com/72gu5IYBdhLWcg3w3qx7#12192358


2
让所有EF生成的类都继承一个实现了INotifyPropertyChanged接口的基类(使用您可能已经定义的非生成部分类)。向这个基类添加一个方法,它使用空字符串作为PropertyName引发PropertyChanged事件。然后,每当在EF生成的类实例上调用此方法时,您WPF UI中的所有修改过的属性将被刷新。

1
你可以编辑EF模板(.tt文件)来生成属性更改的相关内容,或(有点冒险:))编辑生成的类。最后一种方法有些危险,因为如果重新生成模型,所有更改都将丢失。因此,使用包装类的变体或模板编辑(有点困难:S)可能是最好的选择。

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