ViewModel / View关系和验证

时间:2009-04-07 11:20:21

标签: wpf mvvm

在我们的WPF应用程序中,我们希望使用基本的MVVM模式。我们正在讨论它,并且出现了关于ViewModel / View关系和验证的一些不确定性。你会说以下是对它的一个很好的理解吗?

  • 每个视图都只有一个ViewModel 而ViewModel的目的是 提供其数据和视图 处理它的所有View事件和 命令。 (是否存在一个ViewModel为两个视图提供服务的实例,例如标准XAML输入表单视图和CSV导入,它提供与表单相同的数据,因此需要进行相同的验证?)

  • 验证仅由ViewModel 处理,例如风景 抛出ChangedFocus或SaveButtonPressed事件等

  • 模特非常愚蠢,只是存在 基于一个或多个的数据结构 来自数据库的更多表,但是 模型本身无法处理 例如,验证。甚至ViewModel也构建并保存对象的ObservableCollection,例如“客户”而非模特本身。

任何反馈意见。

3 个答案:

答案 0 :(得分:5)

  

每个视图都只有一个ViewModel

我认为如果您对模式的跟随严格,那么每个视图将只有一个ViewModel。我们的应用程序中有一个案例,其中需求在流中更改,并且最简单的方法是让View引用两个不同的ViewModel。根据您实施模式的方式,这可能是也可能不可能。

  

是否存在一个ViewModel为两个视图提供服务的实例

是的,这是该模式的优势之一。

  

验证仅由ViewModel

处理

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

  

模特非常愚蠢

它只是像你想要的那样愚蠢。如果您愿意,可以在模型中包含验证和业务规则。

答案 1 :(得分:3)

我同意上述所有说法。只有一条评论:您的视图模型可以使用其他视图模型。使用此方法,您可以在具有不同视图模型的耦合区域中划分视图。只需使用ContentPresenter,将其绑定到所需的视图模型属性(获取所需的视图模型),并使用DataTemplate将所需视图与视图模型相关联。

答案 2 :(得分:1)

  

是否存在一个ViewModel为两个视图提供服务的实例

皮肤应用程序可以利用此功能。

  

模特非常愚蠢   但模型本身不处理验证

模型可以随心所欲。它可以包含“验证”以确保完整性,但验证不包括在UI中显示的消息。