Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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# 域、DTO和MVVM模型(WPF)-在哪里放置INotifyPropertyChanged?_C#_Wpf_Mvvm - Fatal编程技术网

C# 域、DTO和MVVM模型(WPF)-在哪里放置INotifyPropertyChanged?

C# 域、DTO和MVVM模型(WPF)-在哪里放置INotifyPropertyChanged?,c#,wpf,mvvm,C#,Wpf,Mvvm,我需要创建带有MVVM模式的WPF应用程序作为解决方案的一层。 解决方案有:域、DAL(返回域对象)、DTO、BLL(返回DTO对象) 问题是,在我看来,要实现MVVM模式,我必须在WPF项目中复制我的域模型,以便在它们上实现INotifyPropertyChanged接口?然后,我还必须将这些模型映射到DTO,以便使用BLL服务?视图模型设计用于视图,因此它们并不总是将1-1映射到域对象 有时,视图需要显示来自多个域对象的数据 有时,视图只需要域对象中的一些数据 有时,视图需要仅与视图相关的

我需要创建带有MVVM模式的WPF应用程序作为解决方案的一层。
解决方案有:域、DAL(返回域对象)、DTO、BLL(返回DTO对象)


问题是,在我看来,要实现MVVM模式,我必须在WPF项目中复制我的域模型,以便在它们上实现INotifyPropertyChanged接口?然后,我还必须将这些模型映射到DTO,以便使用BLL服务?

视图模型设计用于视图,因此它们并不总是将1-1映射到域对象

  • 有时,视图需要显示来自多个域对象的数据
  • 有时,视图只需要域对象中的一些数据
  • 有时,视图需要仅与视图相关的数据(例如选定项)

因此,如何将数据填充到ViewModel中的问题可能很复杂。大多数时候,我只是跳过DTO,让ViewModel自己获取数据。或者,如果不可能,让DAL尝试填充ViewModel,就像它是DTO一样。这实际上取决于其他应用程序基础架构的工作方式。一般来说,我会尽量减少图层的数量。理想情况下,我让我的ViewModel尽可能直接地获取它所需的数据。

Inotifypropertychanged需要在您绑定的任何对象上实现,并且您希望在属性更改时通知。 你并不总是需要那个通知。 例如 你在编辑一条记录,你在做改变。 也许这就是你对这些数据所做的一切,唯一的绑定字段就是你刚刚输入的那个字段。 这意味着您可能只需要将dto属性绑定到一个简单的get和set。 虽然-这应该从实现inpc的viewmodel中显示,因为有一个非常微妙的内存泄漏等待着你去发现

回到我们想象中的应用程序。 为什么我们不想直接绑定到实体框架或dto对象

当您尝试保存这些更改时如何。验证失败。 但是你改变了那个对象-那些新值是顽皮的值。 用户“被迫”修复它们,或者您以某种方式放弃更改。 你是怎么让他们退出的? 你在编辑一些dto吗? 因为你的用户刚刚破坏了这些数据。 如果您在某处缓存了一些数据集合,是否直接更改其中一个

显然,您可以再次从数据库中重新读取这些数据。 同样,如果您不让他们编辑该数据,那么您也不需要这样做

我通常会将数据从dto复制到viewmodel中并在其中工作。 我使用一个基于反射的属性复制例程来识别两种类型之间的公共属性。 当每个属性传输到vm和commmit上的所有对象时,我验证viewmodel。
它的值被复制到dto中并发送回存储库或UoW更新方法。

但您的实际问题是什么?你在解释你想做什么,但我看不到答案problem@chinloyal我只是有一种不好的感觉,但似乎我需要抑制它,因为这样做很好:D谢谢