在使用MVVM模式完成了一些项目之后,我仍然在为ViewModel的角色而苦苦挣扎:
我在过去所做的:仅将模型用作数据容器。将操作数据的逻辑放在ViewModel中。(这就是业务逻辑,对吗?)缺点:逻辑是不可重用的。
我现在尝试的是:让ViewModel尽可能的薄。将所有逻辑移动到模型层中。只在ViewModel中保留表示逻辑。缺点:如果数据在Model层内发生更改,则使UI通知非常痛苦。
为了更清楚起见,我给你举个例子:
场景:重命名文件的工具。Classes: File :表示每个文件;Rule:包含如何重命名文件的逻辑;
如果我遵循的是方法1:创建文件、规则和视图-> RenamerViewModel的ViewModel。将所有逻辑放入RenamerViewModel:包含FileViewModel和RuleViewModel的列表以及后续的逻辑。简单快速,但不可重用。
如果我正在遵循方法2:创建一个新的模型类->重命名程序,它包含一个文件、规则和程序逻辑的列表,以在每个文件上迭代并应用每个规则。为文件、规则和重命名程序创建视图模型。现在RenamerViewModel只包含一个重命名程序模型的实例,外加两个用于包装重命名程序的文件和规则列表的ObservableCollections。但整个逻辑都在重命名模型中。因此,如果通过方法调用触发重命名程序模型来操作某些数据,则ViewModel不知道操作了哪些数据。因为该模型不包含任何PropertyChange通知,我将避免这种情况。因此,业务逻辑和表示逻辑是分开的,但这使得通知UI变得很困难。
发布于 2013-05-02 21:10:17
将业务逻辑放在视图模型中是一种非常糟糕的处理方式,所以我将很快地说永远不要做那个,然后继续讨论第二种选择。
将逻辑放在模型中要合理得多,这是一个很好的开始方法。它的缺点是什么?你的问题是
因此,如果通过方法调用触发重命名程序模型来操作某些数据,则ViewModel不知道操作了哪些数据。因为该模型不包含任何PropertyChange通知,我将避免这种情况。
嗯,让你的模型实现INotifyPropertyChanged肯定会让你转向更好的东西。但是,有时确实无法做到这一点--例如,模型可能是一个分部类,其中的属性是由工具自动生成的,并且不会引发更改通知。这是不幸的,但不是世界末日。
如果你想买东西,那么必须有人付钱;如果不是模型给出了这样的通知,那么你只有两个选择:
视图模型知道模型上的哪些操作(可能)导致更改,并在每个此类operation.
第一种选择仍然是一个糟糕的主意,因为它实际上又回到了将“业务逻辑”放入视图模型中。不像把所有的业务逻辑都放在视图模型中那么糟糕,但仍然如此。
第二种选择更有希望(不幸的是,还有更多的工作要实现):
发布于 2013-05-02 21:10:04
这两种方法都是有效的,但还有第三种方法:在模型和VM层之间实现服务。如果您想让您的模型保持沉默,服务可以提供一个与UI无关的中间人,该中间人可以以可重用的方式实施您的业务规则。
,因为模型不包含任何PropertyChange通知,我将避免这种情况
你为什么要回避这个?不要误会我的意思,我倾向于让我的模型尽可能地保持哑巴,但是在你的模型中实现更改通知有时会很有用,而且当你这样做的时候,你只依赖于System.ComponentModel。它完全是UI不可知的。
发布于 2017-08-25 21:14:27
我执行以下操作
使用XAML视图的
任何复杂的应用程序,imo都需要另外一层。我称之为模型+服务,视图,视图模型。该服务抽象您的业务逻辑,并将模型实例作为依赖项或创建模型。
https://stackoverflow.com/questions/16338536
复制相似问题