ViewModel/View 关系与验证

6
在我们的WPF应用程序中,我们想使用基本的MVVM模式。我们正在讨论ViewModel / View关系和验证方面的一些不确定性。您是否认为以下是对此的良好理解?
- 每个View都有一个且仅有一个ViewModel,ViewModel的目的是为其View提供数据并处理其View的所有事件和命令。(是否存在一个ViewModel服务于两个Views的情况,例如标准的XAML输入表单视图和CSV导入,它提供与表单相同的数据,因此需要具有相同的验证?)
- 验证完全由ViewModel处理,例如当视图抛出ChangedFocus或SaveButtonPressed等事件时。
- Model非常简单,只是基于数据库中一个或多个表的数据结构,但是模型本身不处理验证。甚至是ViewModel构建并保存对象的ObservableCollection,例如“Customers”,而不是Model本身。
欢迎任何反馈。
3个回答

6

每个View只有一个ViewModel

如果你严格遵循这个模式,那么每个View只会有一个ViewModel。我们的应用程序中有一种情况是需求在进行中发生了变化,最简单的方法是让View引用两个不同的ViewModel。根据你实现该模式的方式,这可能是可行的,也可能是不可行的。

是否存在一个ViewModel服务于两个Views的情况

是的,这是这个模式的优点之一。

验证仅由ViewModel处理

不一定。我们选择让我们的模型类实现IDataErrorInfo并自己进行验证。这可以确保无论Model类在哪里使用,验证都是相同的。如果验证需要更改,只需要更改一个地方。

Model非常愚蠢

它只愚蠢到你想让它愚蠢为止。如果你愿意,可以在模型中包含验证和业务规则。


3

我完全同意上面所说的。只是想提一下:你的视图模型可以使用其他视图模型。使用这种方法,您可以将视图分成几个区域,并使用不同的视图模型为其服务。只需使用ContentPresenter,将其绑定到所需的视图模型属性(获取所需的视图模型),并使用DataTemplate将所需的视图与您的视图模型相关联。


是的,我在许多示例中看到过这种情况,其中ViewModel具有其中的ViewModel集合,很好的提醒,谢谢。 - Edward Tanguay

1
有没有一种情况,一个ViewModel服务两个View?
可以利用这种能力来改善应用程序的界面。
数据模型本身非常简单,但它本身不处理验证。
模型可以变得越来越智能。 它可以包括“验证”以确保完整性,但该验证不会包含在UI中显示的消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接