WPF真入门教程29--MVVM常用框架之MvvmLight

1、MVVM模式回顾

关于mvvm模式的基础知识,请看这2个文章:

WPF真入门教程23--MVVM简单介绍

WPF真入门教程24--MVVM模式Command命令

做过VUE开发或微信小程序开发的伙伴,就知道MVVM模式,核心就是数据驱动控件,全栈开发人员更是知道什么是前后端分离技术,在windows开发中的WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。使用MVVM架构具有以下优势:1、易维护 2、灵活扩展 3、易测试 4、用户界面设计师与程序开发者能更好的合作。

此图能较好地说明MVVM架构思想

MVVM中,各个部分的职责如下:

**Model:**负责数据实体的结构处理,与ViewModel进行交互;

**View:**负责界面显示,与ViewModel进行数据和命令的交互;

**ViewModel:**负责前端视图业务级别的逻辑结构组织,并将其反馈给前端

2、MVVM开源框架介绍

在WPF中,有几个常用的MVVM(Model-View-ViewModel)开源框架,这些框架提供了方便的工具和模式来帮助开发人员实现MVVM架构。以下是几个常用的MVVM开源框架:

  1. Prism:Prism是一个由微软模式和实践团队开发的开源框架,它提供了一套用于开发可扩展、可测试和可维护的WPF应用程序的工具和指南。Prism提供了解耦视图、模型和视图模型的机制,以及用于导航、命令、事件聚合等常用功能。

  2. Caliburn.Micro:Caliburn.Micro是一个轻量级的MVVM框架,它使用约定优于配置的原则,通过简化开发者的工作流程来提高开发效率。Caliburn.Micro提供了强大的数据绑定、命令绑定、导航和事件聚合等功能。

  3. MVVM Light:MVVM Light是一个简化MVVM开发的框架,它提供了一套轻量级的工具和库,包括视图模型的基类、消息传递机制、事件聚合、导航等功能。MVVM Light支持多个平台,包括WPF、UWP、Xamarin等。

  4. ReactiveUI:ReactiveUI是一个基于响应式编程的MVVM框架,它使用了Reactive Extensions(Rx)库来处理异步和事件驱动的编程。ReactiveUI提供了一种声明性的方式来处理数据流和交互,使代码更加简洁和可维护。

这些MVVM开源框架都有自己的特点和适用场景,您可以根据自己的需求和偏好选择其中之一来开发WPF应用程序。此外,这些框架都有详细的文档和示例代码,可以帮助您更好地了解和使用它们

3、了解MvvmLight框架

关于MvvmLight框架,Light的意思是指非常快,所以他是一个快速开发MVVM程序,非常轻量化,请看这2个地址

官网:http://www.mvvmlight.net/

源码地址:https://github.com/lbugnion/mvvmlight

简介:可以帮助快速的开发MVVM应用程序(WPF、Xarmarin、UWP、SilverLight),帮助开发将视图与模型分开创建更简洁、易于维护的扩展的应用程序。

MVVMLight框架的优点:

  1. 轻量级:MVVMLight框架是一个轻量级的框架,不需要太多的学习和使用成本。

  2. 易于使用:MVVMLight框架提供了很多方便的工具和类,可以帮助开发人员快速地实现MVVM架构。

  3. 可扩展性:MVVMLight框架是可扩展的,可以根据需要添加自定义的功能和模块。

  4. 支持多平台:MVVMLight框架可以用于多个平台,如WPF、UWP、Xamarin等。

  5. 社区支持:MVVMLight框架有一个活跃的社区支持,可以获得很多有用的信息和帮助。

MVVMLight框架的缺点:

  1. 过于简单:MVVMLight框架虽然简单易用,但有时候可能不能满足复杂的业务需求。

  2. 依赖注入不完整:MVVMLight框架的依赖注入功能相对不完整,需要使用第三方库来实现。

  3. 缺乏文档和教程:MVVMLight框架的文档和教程相对较少,对于初学者可能不够友好。

  4. 对于大型项目不够适用:MVVMLight框架适合小型和中型项目,但对于大型项目可能不够适用。

总之,MVVMLight框架是一个轻量级、易于使用、可扩展和支持多平台的框架,但对于复杂的业务需求和大型项目可能不够适用,而且缺乏文档和教程。

MVVM Light框架的核心是ViewModelBase类,它实现了INotifyPropertyChanged接口,用于通知视图层数据的变化。此外,MVVM Light还提供了一些实用的类和工具,如Messenger类用于跨ViewModel传递消息,Command类用于处理用户交互事件等。

MVVMLight的作者Laurent Bugnion 是个微软MVP,有趣的是,MVVMLight的产品Logo是一根羽毛,寓意了他的优点:轻量、专业、高效。

4、获取MvvmLight框架

1、创建项目

2、在Nuget中搜索MvvmLight进行安装

注意看项目文件目录的变化

安装完成后,在项目目录里自动生成了ViewModel文件夹,生成两个文件,一个MainViewModel.cs可以作为MainWindow的viewModel,另一个ViewModelLocator.cs作为ViewModel定位器,通过Ioc容器,在改文件中获取ViewModel的实例。

打开ViewModelLocator.cs文件,发现文件中有报错,这时只需要删除using Microsoft.Practices.ServiceLocation;这句话,然后重新引用using CommonServiceLocator;

快速操作,把错误先消除

3、App.xaml文件的变化

App.xaml中增加了一个Locator,可以作为静态资源使用,用于后面绑定

所以注意:第一次添加时,需要自己处理两个异常,一个是删除引用,一个是添加引用

5、MvvmLight框架基础库

1、GalaSoft.MvvmLight.dll

主要命名空间:

GalaSoft.MvvmLight:最顶层的命名空间,MvvmLight的主体,核心功能 主要对象:ObservableObject、ViewModelBase(实现数据通知相关的内容)、ICleanup

GalaSoft.MvvmLight.Command:主要包含依赖命令的定义 主要对象:RelayCommand、RelayCommand<> 对Icommand的封装

GalaSoft.MvvmLight.Helpers:框架辅助类,供框架内部使用

GalaSoft.MvvmLight.Messaging:消息类,提供全局的消息通知,可以理解为全局的Event事件, 主要对象:Messenger、 NotificationMessage

GalaSoft.MvvmLight.Views:与应用里面的View紧密结合 主要对象:IDialogService、 INavigationService

2、GalaSoft.MvvmLight.Extras.dll

主要命名空间:GalaSoft.MvvmLight.IoC:依赖注入使用的容器 主要对象: ISimpleIoc、SimpleIoC实现

3、GalaSoft.MvvmLight.Platform.dll

主要命名空间: GalaSoft.MvvmLight.Command 主要对象:事件绑定时候,需要传递事件参数EventArgs:EventToCommand GalaSoft.MvvmLight.Threading 主要对象: DispatcherHelper

6、MvvmLight基本对象介绍与使用

1、框架对象ViewModelLocatorr的作用

要将MainViewModelMainWindow绑定起来,只需要在MainWindow上增加绑定DataContext="{Binding Source={StaticResource Locator},Path=Main}",如下所示

2、绑定测试

给界面增加一些控件,一个textblock,一个textbox,一个button

viewmodel绑定

将代码改成这样

3、新ViewModel绑定

1、创建一个新的窗体

2、添加viewmodel,AirViewModel

ICommand和RelayCommand类型的命令都可以,RelayCommand是ICommand的实现类

3、添加样式资源

4、ViewModelLocator.cs修改

注册了容器实例对象后,才可以在xaml文件中指定

5、修改mainviewmodel代码

6、启动程序

RaisePropertyChanged实现了基本INotifyPropertyChanged接口基本的属性变化推送,命令动态更新前台的数据,这就是MVVM,这就是MVVMLIGHT。

相关推荐
Crazy Struggle19 小时前
.NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF
vue·wpf·winform·.net 8.0·通用权限管理
呆萌很2 天前
HCIP-HarmonyOS Application Developer 习题(二十)
华为·wpf·harmonyos
九鼎科技-Leo2 天前
什么是 WPF 中的转换器?如何自定义一个值转换器?
开发语言·windows·c#·.net·wpf
为风而战2 天前
Deepin 系统中安装Rider和Uno Platform
linux·运维·.net·wpf
△曉風殘月〆2 天前
WPF MVVM入门系列教程(三、数据绑定)
c#·wpf·mvvm
^@^lemon tea^@^2 天前
.NET6中WPF项目添加System.Windows.Forms引用
wpf·.net6·windows.forms引用
九鼎科技-Leo2 天前
在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析
windows·c#·.net·wpf
就是有点傻3 天前
WPF自定义翻页控件
wpf
eggcode3 天前
使用ookii-dialogs-wpf在WPF选择文件夹时能输入路径
c#·wpf
code bean3 天前
【wpf】ResourceDictionary 字典资源的用法
windows·c#·wpf