c# - MVVM:精简 ViewModel 和丰富模型

标签 c# wpf mvvm model

我一直在与 MVVM 模式作斗争,并且在尝试为小型/中型项目创建实用设计时遇到了许多挑战。其中一项挑战是弄清楚如何在不创建大量重复且难以维护的代码的情况下获得与此模式分离的好处。

我目前的策略是创建“丰富”的模型类。他们充分意识到他们将被 MVVM 模式消耗并实现 INotifyPropertyChanged,允许他们的集合被观察并保持认识到他们可能总是被观察。我的 ViewModel 类往往很薄,仅在实际需要转换数据时才公开属性,其中大部分代码是 RelayCommand 处理程序。 View 很乐意直接绑定(bind)到 ViewModel 或模型,具体取决于是否需要任何数据转换。我使用 AOP(通过 Postsharp)来减轻 INotifyPropertyChanged 带来的痛苦,以这种方式轻松地使我的所有模型类变得“丰富”。

使用这种方法有明显的缺点吗?我是否可以假设 ViewModel 和 View 紧密耦合,以至于如果我需要为 View 进行新的数据转换,我可以根据需要简单地将它添加到 ViewModel 中?

最佳答案

我认为您的模型上的 INotifyPropertyChanged 仅在您期望它由您的 VM 和外部“力”同时操作时才有用。

我个人是 POCO 模型的支持者。将任何特定于框架的脚手架放入我的模型中会让我担心。当您将事件放入模型类时,您必须仔细考虑模型的生命周期、序列化、存储等可能出现的问题。例如,如果您从数据源重新创建对象并且旧的 INotifyPropertyChanged 订阅现在无效,会发生什么情况?

ObservableCollection 同样更好的地方是在 VM 中,它可以使用 IEnumerable 数据源,并只向 View 显示选定的或临时过滤的项目。

关于c# - MVVM:精简 ViewModel 和丰富模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2650242/

相关文章:

c# - 列出所有 `throw new NotImplementedException()` 方法的任何 VS C# 方法?

c# - 拆分字符串并将其转换为双 C#

c# - IdentityServer4 来自 .net 框架 4.6

c# - WPF 用户控件库中的 UserControl 绑定(bind)不适用于 ContentControl

c# - 如何计算 WPF 数据网格中存在的项目并将其显示在另一个页面中?

c# - 如何为 PDF 文件设置不区分大小写的密码?

WPF 日期选择器 : What is the best?

html - 在WPF控件中,有哪些类似 `<div>`的HTML标签?

wpf - Windows 8.1 为桌面应用程序分配访问权限

c# - WPF DataGrid 上的双重绑定(bind)?