我有一个SQL数据库,正在实现一个WPF UI来更新它。如果我使用EF5从DB生成类,那么如何在生成的类和属性上实现INotifyPropertyChanged,以便我可以轻松地使用UI绑定到它们?有没有简单的方法来实现这一目标?在生成的实体框架类上实现INotifyPropertyChanged
感谢
我有一个SQL数据库,正在实现一个WPF UI来更新它。如果我使用EF5从DB生成类,那么如何在生成的类和属性上实现INotifyPropertyChanged,以便我可以轻松地使用UI绑定到它们?有没有简单的方法来实现这一目标?在生成的实体框架类上实现INotifyPropertyChanged
感谢
如果按照WPF推荐MVVM模式,你可以把你生成的类的模型,然后编写执行INotifyPropertyChanged的ViewModel包装。 ViewModel类将访问您的数据库类并公开可以绑定到XAML中的UI的属性。
正如您在评论中指出的那样,这可能会导致编写样板代码的许多工作,但有一些方法可以解决这个问题。有些想法参见this question。
在开始做更多的工作时,如果您需要执行任何中间格式化或处理,或者如果您需要更改数据库类而不影响UI,MVVM模式可以长期得到回报。
我最近需要做同样的事情,但使用Winforms。如果您不想按照bde的建议来遵循MVVM模式,您可以修改t4模板以在您生成的实体上实现INotifyPropertyChanged。
您可以编辑该模板EF(.TT文件)来生成你的属性的PropertyChanged的东西,或(有点冒险:))编辑生成的类。最后一点有点冒险,因为如果您重新生成模型,所有更改都将丢失。所以也许包装类或模板编辑的变体(有点难:S)是最好的。
有一个名为PropertyChanged.Fody的NuGet包,它使得将INotifyPropertyChanged添加到类属性非常简单。一旦你安装了软件包,只需将[ImplementPropertyChanged]属性添加到任何类或部分类中,包就会为你添加INotifyPropertyChanged。
下面是它的一个简单例子;
using PropertyChanged;
[ImplementPropertyChanged]
public partial class Order
{
}
查看GitHub了解更多信息。
使所有EF生成的类继承自一个实现了INotifyPropertyChanged
接口的类(使用您可能已经定义的非生成的部分类)。向此基类中添加一个方法,该方法使用空字符串PropertyName
引发PropertyChanged
事件。然后,每当您在EF生成的类实例上调用此方法时,其所有修改的属性都将在您的WPF UI中刷新。
例如,如果我已经生成了'class Asset {public int id {get; set;}}'我会写'class AssetWrap:Asset,INotifyPropertyChanged {public int idNotify {get {return id; } set {id = value; NotifyPropertyChanged();}}}如果是这样,那似乎很耗时间。 – Steve
通常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