在生成的Entity Framework类上实现INotifyPropertyChanged

时间:2013-01-03 02:41:09

标签: wpf entity-framework xaml

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

由于

5 个答案:

答案 0 :(得分:13)

如果您遵循WPF的推荐MVVM模式,则可以将生成的类视为模型,然后编写实现INotifyPropertyChanged的ViewModel包装器。 ViewModel类将访问您的数据库类并公开可以绑定到XAML中的UI的属性。

正如你的评论中所指出的,这可能会导致大量编写样板代码的工作,但有一些方法可以解决这个问题。有关一些想法,请参阅this question

一开始有更多的工作,如果您需要进行任何中间格式化或处理,或者如果您需要在不影响UI的情况下更改数据库类,则MVVM模式从长远来看肯定会得到回报。

答案 1 :(得分:5)

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

这个答案对我有帮助:https://stackoverflow.com/a/12192358/1914530

答案 2 :(得分:3)

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

这是一个使用它的简单例子;

using PropertyChanged;

[ImplementPropertyChanged]
public partial class Order
{
}

有关详细信息,请参阅GitHub

答案 3 :(得分:1)

您可以编辑EF模板(.tt文件)以在您的属性上生成propertyChanged内容,或者(有点冒险:))来编辑生成的类。最后一点有点冒险,因为如果重新生成模型,所有更改都将丢失。所以也许带有包装类或模板编辑的变体(有点难:S)是最好的。

答案 4 :(得分:1)

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