在使用 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 变得很困难。