Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在绑定视图/视图模型中反映对模型的外部更改_C#_Wpf_Design Patterns_Mvvm_Inotifypropertychanged - Fatal编程技术网

C# 在绑定视图/视图模型中反映对模型的外部更改

C# 在绑定视图/视图模型中反映对模型的外部更改,c#,wpf,design-patterns,mvvm,inotifypropertychanged,C#,Wpf,Design Patterns,Mvvm,Inotifypropertychanged,我有一个非常标准的视图和视图模型。INotifyPropertyChanged在vm中实现,它使用各种模型对象(EF中的实体)的基础数据的代理属性 这对于简单的情况很好,但是,应用程序中运行的其他代码可能会改变实体。由于实体未实现INotifyPropertyChanged,因此显示该特定时间数据的任何视图都不会反映数据中的更改 我正在考虑用某种监视所有底层属性变化的观察者来包装实体,然后vm可以使用观察者,而不是实体。然而,这给我留下了深刻的印象,因为首先需要大量样板代码(以及大量不必要的重复

我有一个非常标准的视图和视图模型。INotifyPropertyChanged在vm中实现,它使用各种模型对象(EF中的实体)的基础数据的代理属性

这对于简单的情况很好,但是,应用程序中运行的其他代码可能会改变实体。由于实体未实现INotifyPropertyChanged,因此显示该特定时间数据的任何视图都不会反映数据中的更改

我正在考虑用某种监视所有底层属性变化的观察者来包装实体,然后vm可以使用观察者,而不是实体。然而,这给我留下了深刻的印象,因为首先需要大量样板代码(以及大量不必要的重复)将实体包装到观察者中,然后再重新包装观察者以在vm中创建代理属性


这一定是一个常见的问题,但我找不到任何真正的解决办法。我在这里遗漏了什么吗?

使用中介模式可能会对您有所帮助。它封装了对象之间的交互方式

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

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

这在谷歌的实施细节上有很好的记录

找到的第一个链接:


我看到的一件使用得很好的事情是使用Castle DynamicProxy包装模型对象并使用包装的对象。你可以在这里读到。(忽略
拦截器
,因为它是特定于NHibernate的。)。只要您准备好在VM中使用包装对象,这就符合您的需要。请记住,这只适用于酒店。谢谢,是的,这将是一个不错的选择。我使用的是prism/unity,所以我可以截取。但老实说,我只是在业务/模型对象上实现了INotifyPropertyChanged。我意识到我只是在原则上试图避免这样做,而这是一个与UI无关的原因,因此我认为这是完全正确的。我认为中介模式在这里真的是太过分了。我有相对较轻的对象,使用调解人将是解决问题的一种不必要的复杂方式。不比观察者更复杂。它还需要更少的锅炉板代码。