3

到目前为止,我一直在使用 Visual Studio 2010 和 Entity Framework 4.x。(数据库优先)。对于我生成的一些实体类,我添加了部分类定义和一些只读属性。要获得有关属性更改的通知,我可以处理实体的 PropertyChanged 事件,并在查询的属性之一发生更改时为添加的只读属性引发 PropertyChanged 事件。非常简单。

最近我切换到 Visual Studio 2012,它默认包含 Entity Framework 5。我从现有数据库(数据库优先)创建了一个新模型,并生成了实体类。但似乎生成的类无法利用 INotifyPropertyChanged - 因为它们是 POCO 类(这是默认代码生成策略),因此不像 Entity Framework 4.x 中那样从 EntityObject 派生。

所以我的第一个问题是:使用 Entity Framework 5(数据库优先),我如何才能获得有关属性更改的通知?这一定是可能的,因为 WPF 中的数据绑定确实有效,即使绑定了刚刚创建的实体类实例(因此它不是来自上下文查询的动态实体代理)。

我的第二个问题是:使用 Entity Framework 5(数据库优先),我如何将实体对象的关联集合绑定到 wpf 控件?实体关系的生成关联属性是 ICollection,具有默认的 HashSet 实例。因此,当添加或删除相关实体对象时,绑定的 wpf 控件不会收到有关该集合更改的通知(即使在实体集的本地属性中使用 ObservableCollection 时,关联属性仍然是没有更改通知的 HashSets..) .

实现这些基本目标的“预期”方式是什么?

在此先感谢,汉内斯

4

1 回答 1

1

手动方法:为什么不先使用代码并从有趣的设置器手动引发 PropertyChanged 事件?工作量很大,但控制力很强。

动态方法 假设您有一个 EditViewModel,它有一个名为 Document 的属性,其中包含对生成的 EF 实体的引用,您需要绑定到此 Document 属性。

利用适配器设计模式,您可以将实体包装在一个类中,该类实现 INotifyPropertyChanged 并在调用 setter 时引发 PropertyChanged 事件。而不是绑定到您在拦截器上绑定的实体,女巫会引发属性更改并使用反射 api 将属性调用委托给包装的实体对象。

你可以在这里找到一个很好的例子,目标是让 ViewModel 实现 INotifyPropertyChanged 但你也可以对文档执行此操作:http ://www.hightech.ir/SeeSharp/best-implementation-of-inotifypropertychange-ever

于 2013-02-19T06:48:23.257 回答