在使用MVVM模式完成了几个项目之后,我仍然困惑于ViewModel的角色:
我过去做过的事情: 1. 仅将Model用作数据容器。 2. 将操作数据的逻辑放到ViewModel中。(这是业务逻辑吧?) 缺点:逻辑不可重用。
现在我尝试的是: 尽可能使ViewModel变得简单。 将所有逻辑移动到Model层。 仅在ViewModel中保留表示逻辑。 缺点:如果数据在Model层内被更改,则UI通知会变得非常麻烦。
下面我会举个例子来让它更加清晰:
场景: 重命名文件的工具。 类: File:表示每个文件; Rule:包含如何重命名文件的逻辑;
如果我遵循第一种方法: 为File、Rule和View创建一个RenamerViewModel的ViewModel。 将所有逻辑都放在RenamerViewModel中: 包括FileViewModel和RuleViewModel的列表以及处理逻辑。 简单快捷,但不可重用。
如果我遵循第二种方法: 创建一个新的模型类-Renamer,其中包含一个File、Rule列表和迭代每个文件并应用每个规则的处理逻辑。 为File、Rule和Renamer创建一个ViewModel。 现在,RenamerViewModel仅包含Renamer模型的一个实例,以及两个ObservableCollections,用于包装Renamer的File和Rule列表。 但是,所有逻辑都在Renamer Model中。因此,如果通过方法调用触发Renamer Model来操纵某些数据,则ViewModel不知道操纵哪些数据。 因为Model不包含任何PropertyChange通知,而我会避免这种情况。 因此,业务逻辑和表示逻辑被分开,但这使得通知UI变得更加困难。