在MVVM模式中,View封装UI和UI逻辑,viewmodel封装presentation逻辑,model封装业务逻辑和数据。
View类
View的责任是定义屏幕上的结构和外观,在完美的情况下,view的code behind只包含一个构造函数,这个构造函数调用InitializeComponent()函数,但是通常情况下,code behind会包含XAML标签难以表达的UI逻辑代码,所谓UI逻辑代码是指跟显示行为相关而不包含任何其它逻辑的代码,例如:复杂动画或者直接操纵view中可视化元素的代码,
view通过数据绑定与它的数据上下文交互,在MVVM模式中,view的数据上下文被置于viewmodel中,viewmodel实现了view数据绑定所需要的properties和commands,同时通过change notification events通知视图其状态的变化。view跟viewmodel的典型关系是1对1。
总结一下,view具有以下特性:
- view是一个可视化元素,例如window、page、user control、view定义了包含在其中的控件以及这些控件的布局和样式。
- view通过DataContext属性引用它的view model,view中的控件绑定到view model中的property和command。
- view可以定制和view model绑定的行为,例如,view可以使用converter格式化显示在UI上的数据,也可以使用validation rules对用户的输入进行验证。
- view可以定义和处理UI可视化的行为,例如由viewmodel中状态变化或者用户交互引起的动画或者变换。
- view的code behind可以定义UI逻辑来实现XAML难以表达的可视化行为或者直接操纵view中可视化元素的行为。
View Model类
View model定义presentation logic和view所需要的数据,它不引用view而且对view的实现一无所知,view model实现view用于绑定的properties和commands,并且使用change notification events通知视图其状态的变化,properties和commands定义了UI所需的功能,而view决定了如何展现这些功能。
View model的责任是协调view和所需model的交互,通常情况下,view model和model是1对n的关系,view model可以选择将model类直接暴露给view类,使得view中的控件能直接绑定到model,在这种情况下,model类需要被设计成支持数据绑定和相应的通知机制。
总结一下,view model具有以下特性:
- view model封装presentation logic来支持应用所需的use case。
- view model不直接引用view,它实现view用于绑定的properties和commands,并且使用change notification events通知视图其状态的变化.
- view model协调view和model的交互。
- view model可以定义view呈现所需的逻辑状态。
Model类
Model封装业务逻辑和数据。它代表应用程序的领域模型在客户端的表现,既包括客户端领域实体也包括客户端领域逻辑,因此是一个非常广泛的概念。
总结一下,model具有以下特性:
- Model封装业务逻辑和数据,它负责管理应用程序数据和封装业务逻辑和验证逻辑保证数据的一致性。
- model不直接引用view和view model。
- model类通常提供属性或者集合change notification events,方便和view的绑定。
- model类通常使用IDataErrorInfo接口和INotifyDataErrorInfo接口提供数据验证和错误报告。
- model通常和service或者repository一起使用。