2013-01-03 52 views
14

我有一个SQL数据库,正在实现一个WPF UI来更新它。如果我使用EF5从DB生成类,那么如何在生成的类和属性上实现INotifyPropertyChanged,以便我可以轻松地使用UI绑定到它们?有没有简单的方法来实现这一目标?在生成的实体框架类上实现INotifyPropertyChanged

感谢

回答

13

如果按照WPF推荐MVVM模式,你可以把你生成的类的模型,然后编写执行INotifyPropertyChanged的ViewModel包装。 ViewModel类将访问您的数据库类并公开可以绑定到XAML中的UI的属性。

正如您在评论中指出的那样,这可能会导致编写样板代码的许多工作,但有一些方法可以解决这个问题。有些想法参见this question

在开始做更多的工作时,如果您需要执行任何中间格式化或处理,或者如果您需要更改数据库类而不影响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

+0

我可以看到MVVM的好处,但他们确实需要一些MVVM生成器,而不是它们,因为它经常会遵循相同的模板。 – Steve

5

我最近需要做同样的事情,但使用Winforms。如果您不想按照bde的建议来遵循MVVM模式,您可以修改t4模板以在您生成的实体上实现INotifyPropertyChanged。

这个答案让我:https://stackoverflow.com/a/12192358/1914530

1

您可以编辑该模板EF(.TT文件)来生成你的属性的PropertyChanged的东西,或(有点冒险:))编辑生成的类。最后一点有点冒险,因为如果您重新生成模型,所有更改都将丢失。所以也许包装类或模板编辑的变体(有点难:S)是最好的。

1

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

下面是它的一个简单例子;

using PropertyChanged; 

[ImplementPropertyChanged] 
public partial class Order 
{ 
} 

查看GitHub了解更多信息。

0

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