【发布时间】:2014-09-14 10:12:41
【问题描述】:
我有一个非常标准的视图和视图模型。 INotifyPropertyChanged 在 vm 中实现,使用代理属性跨各种模型对象(来自 EF 的实体)的基础数据。
这适用于简单的情况,但是,实体可能会被应用程序中运行的其他代码更改。因为实体没有实现 INotifyPropertyChanged,所以在特定时间显示数据的任何视图都不会反映数据的变化。
我正在考虑用某种观察者包装实体,该观察者监视所有底层属性的变化,然后 vm 可以与观察者一起工作,而不是与实体一起工作。然而,这让我感到震惊,因为需要大量的样板代码(以及许多不必要的重复)首先将实体包装在观察者中,然后再重新包装观察者以在 vm 中创建代理属性。
这一定是一个常见问题,但我找不到任何真正整洁的解决方案。我在这里遗漏了什么吗?
【问题讨论】:
-
我看到使用得很好的一件事是使用 Castle DynamicProxy 来包装模型对象并使用被包装的对象。你可以在这里读到它。 ayende.com/blog/4106/nhibernate-inotifypropertychanged(忽略
Interceptor,因为它是 NHibernate 特有的。)。只要您准备好在 VM 中使用包装的对象,这符合您的需要。请记住,这仅适用于属性。 -
谢谢,是的,这将是一个不错的选择。我正在使用棱镜/统一,所以我可以拦截。不过老实说,我只是在业务/模型对象上实现了 INotifyPropertyChanged。我意识到我只是在原则上试图避免这样做,而这是一个与 UI 无关的这样做的原因,因此我认为是完全有效的。
标签: c# wpf design-patterns mvvm inotifypropertychanged