我有一个 SQL DB,并且正在实现一个 WPF UI 来更新它。如果我使用 EF5 从 DB 生成类,如何在生成的类和属性上实现 INotifyPropertyChanged,以便我可以使用 UI 轻松绑定到它们?有没有简单的方法来实现这一目标?
谢谢
我有一个 SQL DB,并且正在实现一个 WPF UI 来更新它。如果我使用 EF5 从 DB 生成类,如何在生成的类和属性上实现 INotifyPropertyChanged,以便我可以使用 UI 轻松绑定到它们?有没有简单的方法来实现这一目标?
谢谢
如果您遵循 WPF 的推荐MVVM模式,则可以将生成的类视为模型,然后编写实现 INotifyPropertyChanged 的 ViewModel 包装器。ViewModel 类将访问您的 DB 类并公开您可以在 XAML 中绑定到您的 UI 的属性。
正如您在评论中指出的那样,这可能会导致编写样板代码的大量工作,但有一些方法可以解决这个问题。有关一些想法,请参阅此问题。
虽然一开始需要做更多的工作,但如果您需要进行任何中间格式化或处理,或者如果您需要在不影响 UI 的情况下更改数据库类,则 MVVM 模式绝对可以从长远来看得到回报。
有一个名为 PropertyChanged.Fody 的 NuGet 包,它使将 INotifyPropertyChanged 添加到类属性非常简单。安装包后,只需将 [ImplementPropertyChanged] 属性添加到任何类或部分类,包就会为您添加 INotifyPropertyChanged。
这是一个简单的使用示例;
using PropertyChanged;
[ImplementPropertyChanged]
public partial class Order
{
}
有关更多信息,请参阅GitHub。
我最近需要做同样的事情,但使用 Winforms。如果您不想遵循 bde 建议的 MVVM 模式,您可以修改 t4 模板以在生成的实体上实现 INotifyPropertyChanged。
使所有 EF 生成的类都继承自实现INotifyPropertyChanged
接口的类(使用您可能已经定义的非生成部分类)。PropertyChanged
向此基类添加一个方法,该方法使用空字符串引发事件作为PropertyName
. 然后,每次在 EF 生成的类实例上调用此方法时,其所有修改的属性都将在 WPF UI 中刷新。
您可以编辑 EF 模板(.tt 文件)以在您的属性上生成 propertyChanged 内容,或者(有点冒险:))来编辑生成的类。最后一个有点冒险,因为如果重新生成模型,所有更改都会丢失。所以也许包装类的变体或模板编辑(有点难:S)是最好的。