MVVM教程

 1.MVVM设计模式简介

 

     MVVM的设计模式最早于2005年由微软的WPF和Silverlight架构师John Gossman在他的博客中提到。以下是这篇文章的链接:

     http://blogs.msdn.com/b/johngossman/archive/2005/10/08/478683.aspx

     MVVM设计模式基于MVC这种将UI和逻辑分离的结构思想。传统的.NET平台下软件开发如ASP.NET和WPF/Silverlight大多数是基于CodeBehind这样的方式,我们往往将所有的代码全部写在后台代码文件中,例如UI操作,业务逻辑操作,IO,数据服务的调用等等。这虽然表面上有利于“开发效率”,实际上项目结构不清晰,各个模块之间紧密耦合,不利于扩展,不利于测试。

     MV-X的思想,为.NET平台下的架构提供一种很好的实践。使我们可以构建更利于扩展,结构清晰,职责分明,易测试的软件项目。

     但是目前MVVM模式还没有一个标准的实践,微软也还没有给出相对标准的方案。目前社区讨论的主要是MVVM的思想。在实际开发过程中形成了几种不同的风格。其中以Josh Smith的文章影响比较大:

     http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

     本篇提到的也主要是参考John Smith的思想。

2.采用MVVM设计模式的好处

    

     在Silverlight或者WPF中采用MVVM的架构可以获得以下好处:

     1. 项目可测试更高,从而可以执行单元测试

     2. 将UI和业务的设计完全分开,View和UnitTest只是ViewModel的两个不同形式的消费者

     3. 有助于我们区别并哪些是UI操作,哪些是业务操作,而不是将他们全混在CodeBehind中

     3.项目结构介绍

     以下是示例项目的结构截图:

vs

以下是各模块之间的联系:

org

 

4.WpfMVVMSample.Foundation

     提供一些基础类定义。

5.Model的职责

    

     Model主要提供基础实体的属性以及每个属性的验证逻辑。

     Model不包含数据的调用,但是可以包含简单的非数据调用的操作,如产生序列号或者合并字段。

     对于WCF产生的客户端代理类,Models中应有与之相对应的类结构定义。

     Model不依赖于任何项目。

6.IService和Services以及ServiceTest

     IService是所有网络数据服务或者IO操作的服务接口。

     IService中的数据访问方式以异步为主,见参考示例。

     Service是真实的数据服务访问类,是IService的实现。ServiceTest是用于测试ViewModel的IService的实现

7.ViewModel的职责

    

     ViewModel是MVVM架构中最重要的部分,ViewModel中包含属性,命令,方法,事件,属性验证等逻辑。为了与View以及Model更好的交互来满足MVVM架构,ViewModel的设计需要注意一些事项或者约束:

    ViewModel的属性:ViewModel的属性是View数据的来源。这些属性可由三部分组成:

     一部分是Model的复制属性。

    另一部分用于控制UI状态。例如一个弹出窗口的控件可能有一个IsClose的属性,当操作完成时可以通过这个属性更改通知View做相应的UI变换或者后面提到的事件通知。

    第三部分是一些方法的参数,可以将这些方法的参数设置成相应的属性绑定到View中的某个控件,然后在执行方法的时候获取这些属性,所以一般方法不含参数。

     ViewModel的命令:ViewModel中的命令用于接受View的用户输入,并做相应的处理。我们也可以通过方法实现相同的功能。

     ViewModel的事件: ViewModel中的事件主要用来通知View做相应的UI变换。它一般在一个处理完成之后触发,随后需要View做出相应的非业务的操作。所以一般ViewModel中的事件的订阅者只是View,除非其他自定义的非View类之间的交互。

     ViewModel的方法:有些事件是没有直接提供命令调用的,如自定义的事件。这时候我们可以通过CallMethodAction来调用ViewModel中的方法来完成相应的操作。

8.View及Codebehind

     View中使用Command:View中的Button等控件可以直接绑定Command属性调用ViewModel中的Command

     View中使用CallMethodAction :一些不支持Command的控件,可以用一个CallMethodAction触发器来执行ViewModel中的方法。注意的是方法当中往往包含一些参数,这些参数一般可以通过给ViewModel设置相应的属性来绑定到相关的输入控件,如TextBox。

     View中使用DataTrigger:除了模型属性,还有一部分是状态属性,这往往是ViewModel通过属性更改的方式通知View做出相关的UI操作,例如触发一段动画,或者切换控件状态等等。这个时候可以使用一些触发器,当状态值不同时做出相应的UI变换。

    View的CodeBehind中初始化子View的ViewModel上下文:View一般由父View调用,所以View的ViewModel一般由父View来初始化。比如当点击人脉按钮,需要显示人脉的View的时候,就由主框架初始化人脉的ViewModel,并显示人脉的View。

     View的CodeBehind中订阅子View的UI事件:除了通过状态属性的变更触发View中的触发器,看一种选择是在View的CodeBehind中订阅ViewModel的UI事件。

9.View及ViewModel交互模式总结

由以上解析我们可以总结出View和ViewModel的交互模式:

1. 父View在CodeBehind中初始化子ViewModel

2. 父View在CodeBehind中订阅子ViewModel的UI事件

3. 父View将子ViewModel赋值给子View的DataContext,并显示子View

4. 父View调用子ViewModel获取数据的方法,子ViewModel调用数据服务获取数据

5. ViewModel的数据通过Binding传递给View

6. View接受用户输入,并通过Command或者CallMethodAction交给ViewModel做业务处理

7. ViewModel处理完成之后触发UI事件或者更改状态属性通知父View

8. 父View做出View变换至新的界面

10. 依赖注入

ViewModel的职责是提供数据给View,并调用底层的数据服务。

为了解除ViewModel和BP的耦合,增加一层IService的接口定义,这也使得我们可以构造不同的IService实现来测试ViewModel。

但是View 在使用ViewModel的时候,ViewModel必须要使用IService对象,所以这里采用依赖注入。通过依赖注入来完全解除View以及ViewModel对于Service的依赖。

示例项目源代码下载:

http://files.cnblogs.com/hielvis/WpfMVVMSample.rar

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MVVM Light 是一个开源的 MVVM (Model-View-ViewModel) 框架,用于开发 Windows 平台的应用程序。它的主要优点在于简洁易用、轻量级,支持 WPFSilverlight、Windows Phone、Windows 8/8.1、Windows 10 UWP 等平台。 下面是一个简单的 MVVM Light 使用教程: 1. 首先,安装 MVVM Light 框架。可以通过 NuGet 包管理器安装,命令如下: Install-Package MvvmLight 2. 在项目中添加一个 ViewModel 类。这个类会绑定到 View 上。 3. 编写 View 的 XAML 代码。在根元素上添加 DataContext 属性绑定到 ViewModel。 4. 编写 ViewModel 类中的逻辑代码。这些代码会更新 View 的状态。 5. 在 View 的 XAML 代码中添加绑定。例如,将一个文本框的 Text 属性绑定到 ViewModel 中的一个属性上。 6. 在 ViewModel 中使用命令来处理 View 上的用户交互。 7. 按照需要使用其他 MVVM Light 的功能,例如消息传递、导航、本地化等。 最后,我需要提醒你 MVVM 是一种模式,不同的框架可能有不同的实现,每种框架都有它的优缺点,需要根据自己的需求来选择合适的框架. ### 回答2: MVVMLight是一个为Windows应用程序提供MVVM(Model-View-ViewModel)模式支持的开源框架。它是由Laurent Bugnion创建的,旨在简化应用程序的设计和开发。 MVVMLight提供了一组工具和库,帮助开发人员在应用程序中实现MVVM模式。其中包括ViewModelBase类,用于创建视图模型,并提供属性更改通知功能。它还提供了一个Messenger类,用于在视图模型之间进行消息传递,使它们能够相互通信。 除了上述基本功能外,MVVMLight还提供了其他实用工具,如ViewModelLocator,用于自动定位和创建视图模型实例。它还提供了EventToCommand功能,可以将事件绑定到命令,使开发人员能够将用户交互行为直接绑定到视图模型中的命令。 MVVMLight还提供了一些与平台相关的功能,如在WPF应用程序中的消息框服务和对话框服务。它还支持导航功能,可以帮助开发人员实现应用程序中的导航逻辑。此外,它还提供了对IoC(Inversion of Control)容器的集成,使开发人员能够轻松地使用依赖注入来管理应用程序中的对象。 总之,MVVMLight是一个强大而灵活的框架,可以帮助开发人员更轻松地实现MVVM模式,并提高应用程序的可维护性和可扩展性。它提供了许多实用工具和功能,帮助开发人员处理常见的应用程序开发任务,使他们能够更专注于业务逻辑的实现。无论是新手还是有经验的开发人员,都可以从MVVMLight中受益,并加快应用程序的开发进程。 ### 回答3: MVVMLight是一款用于开发基于MVVM设计模式的框架, 它是由GalaSoft的Laurent Bugnion所创建和开发的。MVVM代表模型(View-Model-View Model)视图模型,是一种用于构建用户界面的软件架构模式。 MVVMLight的教程涵盖了许多有关使用该框架的详细信息和指南。教程通常会从基础知识开始,逐步介绍MVVMLight的各个组件和功能。它将帮助开发人员了解如何设置和配置MVVMLight,以及如何使用它来构建可维护和可扩展的应用程序。 教程通常包括以下内容: 1. MVVM框架的简介和概述。 2. MVVMLight的安装和配置。 3. MVVMLight的主要概念和组件,例如ViewModelBase、RelayCommand、Messenger等。 4. 如何使用MVVMLight来绑定视图和视图模型。 5. 如何处理用户交互和数据验证。 6. 如何使用MVVMLight中的导航和导航参数。 7. 如何利用MVVMLight创建模块化和可测试的应用程序。 通过学习MVVMLight的教程,开发人员可以获得关于MVVM设计模式以及MVVMLight框架的深入理解。这将使开发人员能够更好地利用MVVMLight的功能和优势来开发高质量、易于维护的应用程序。 MVVMLight的教程对于想要进一步学习和探索MVVMLight的开发人员来说是非常有价值的资源,它提供了实用的示例和指导,以帮助开发人员快速上手并充分利用这个强大的框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值