【发布时间】:2013-04-26 15:42:21
【问题描述】:
在使用 MVVM 模式做了几个项目后,我仍然在为 ViewModel 的角色苦苦挣扎:
我过去做了什么: 仅将模型用作数据容器。 将逻辑用于操作 ViewModel 中的数据。 (这就是业务逻辑对吗?) 缺点:逻辑不可重用。
我现在正在尝试什么: 保持 ViewModel 尽可能薄。 将所有逻辑移入模型层。 仅在 ViewModel 中保留演示逻辑。 缺点:如果模型层内的数据发生更改,UI 通知会非常痛苦。
所以我给你举个例子让大家更清楚:
场景: 重命名文件的工具。 课程: File :代表每个文件; 规则:包含如何重命名文件的逻辑;
如果我遵循方法 1: 为文件、规则和视图创建 ViewModel -> RenamerViewModel。 将所有逻辑放在 RenamerViewModel 中: 包含 FileViewModel 和 RuleViewModel 的列表以及进行的逻辑。 简单快捷,但不可重复使用。
如果我遵循方法 2: 创建一个新的模型类 -> 重命名器,其中包含一个文件列表、规则和后续逻辑,以对每个文件进行交互并应用每个规则。 为文件、规则和重命名器创建视图模型。 现在 RenamerViewModel 只包含一个 Renamer Model 的实例,外加两个 ObservableCollections 来包装 Renamer 的 File und Rule List。 但整个逻辑都在重命名模型中。因此,如果 Renamer Model 被触发以通过方法调用来操作某些数据,则 ViewModel 不知道操作了哪些数据。 因为模型不包含任何 PropertyChange 通知,我会避免这种情况。 所以业务逻辑和表现逻辑是分开的,但是这使得通知 UI 变得很困难。
【问题讨论】:
标签: c# wpf design-patterns mvvm