【问题标题】:reflecting external changes to a model within a bound view/viewmodel反映绑定视图/视图模型中模型的外部更改
【发布时间】: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


【解决方案1】:

使用中介者模式可能会让您受益。它封装了对象之间的交互方式。

通过将每个视图模型注册到“Mediator”单例类,我的视图模型之间有一个链接。这意味着我让中介类知道的所有视图模型。然后我可以在中介上调用一个“通知”方法,向它发送一个标识符。

当此通知通过时,中介可以查看具有该标识符的属性,该标识符放置在其他已注册视图模型中的方法上。如果属性与标识符匹配,它将运行该方法。

这已通过 google 详细记录在实施细节中。

找到第一个链接:

http://www.dofactory.com/net/mediator-design-pattern

【讨论】:

  • 我认为调解者模式在这里真的有点矫枉过正。我有相对较轻的对象,使用调解器将是解决问题的一种不必要的复杂方法。
  • 不比观察者复杂。它还需要更少的样板代码。
猜你喜欢
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多