当前位置: 首页 > news >正文

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。

 

相关文章:

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

1、MVVM模式回顾 关于mvvm模式的基础知识&#xff0c;请看这2个文章&#xff1a; WPF真入门教程23--MVVM简单介绍 WPF真入门教程24--MVVM模式Command命令 做过VUE开发或微信小程序开发的伙伴&#xff0c;就知道MVVM模式&#xff0c;核心就是数据驱动控件&#xff0c;全栈开…...

QT-Day4

思维导图 作业&#xff1a; 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMessageBox> #include <QTimerEvent>//定时器事件类 #include <QTime> #include <QDebug> #include <QPushButton> #include <QT…...

代码随想录算法训练营第三天

● 自己看到题目的第一想法 203.移除链表元素 方法一&#xff1a; 思路&#xff1a; 设置虚拟头节点 dummyhead 设置临时指针 cur 遍历 整个链表 循环&#xff1a; 如果 cur !nullptr &&cur->next !nullptr 则 遍历链表 否则结束遍历 如果 cur->next val 则…...

蓝桥杯刷题1

目录 1. 平方和 2. 门牌制作 3. 卡片 4. 分数 5. 星期一 6. 顺子日期 1. 平方和 题目描述&#xff1a;小明对数位中含有2、0、1、9 的数字很感兴趣&#xff0c;在1 到40 中这样的数包 括1、2、9、10 至32、39 和40&#xff0c;共28 个&#xff0c;他们的和是574&#x…...

前端学习---- 前端HTML基本元素的介绍

一&#xff1a;显示相关的HTML基础知识 1. 推荐的前端编写工具 2. VScode的html速写规则&#xff08;从a标签开始再用&#xff09; ①、&#xff01;&#xff1a;代表生成html的基本框架元素 ②、html元素&#xff1a;直接书写html,不需要加<>,按回车会自动生成 ③、{}…...

力扣思路题:丑数

此题的思路非常奇妙&#xff0c;可以借鉴一下 bool isUgly(int num){if(num0)return false;while(num%20)num/2;while(num%30)num/3;while(num%50)num/5;return num1; }...

C# this关键字的作用

在C#中&#xff0c;this 关键字有以下几种主要作用&#xff1a; 引用当前对象&#xff1a;this 用于引用当前类的实例。可以通过 this 关键字来访问当前对象的成员变量、方法和属性。 class MyClass {private int myVar;public void SetVar(int var){this.myVar var; // 使用…...

Ubuntu18.04虚拟机磁盘扩容-lvm

Ubuntu18.04虚拟机磁盘扩容-lvm 前提虚拟机虚拟磁盘扩容使用新增的磁盘空间扩展vg和lv 前提 没有虚拟机快照虚拟磁盘不是一次性分配空间其它会影响扩容的前置条件 虚拟机虚拟磁盘扩容 此部分不做详细说明。 使用新增的磁盘空间 此节有两种办法&#xff0c;第一种是将新增的…...

低代码开发:数字赋能智能制造的未来

随着数字化转型的深入推进&#xff0c;智能制造已经成为我国制造业发展的重要方向。在这个过程中&#xff0c;低代码开发作为一种高效、便捷的编程方式&#xff0c;正逐渐成为企业数字化转型的得力助手。本文将探讨低代码开发在智能制造领域的应用及价值。 智能制造的挑战 随着…...

janus-gateway的videoroom插件的RTP包录制功能源码详解

引: janus-gateway在配置文件设置后&#xff0c;可以实现对videoroom插件的每个publisher的音频&#xff0c;视频&#xff0c;数据的RTP流录制成mjr文件。 对于音频&#xff0c;视频的mjr文件&#xff0c;可以使用自带的postprocessing工具janus-pp-rec转成mp4文件。 每个pu…...

nginx+keepalived实现nginx高可用集群以及nginx实现Gateway网关服务集群

一、前言 1、简介 Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;被广泛使用。且现如今很多高并发场景需要后端服务集群部署&#xff0c;因此nginx也需要支持集群部署从而避免单点故障的问题。 本文将详细介绍使用 KeepalivedNginx 来实现Nginx的高可用集群和N…...

主键、外键、建表范式、MySQL索引、用户管理

1 案例1&#xff1a;主键 1.1 问题 完成如下练习&#xff1a; 练习主键的创建、查看、删除、添加、验证主键练习复合主键的使用练习与auto_increment连用的效果 1.2 方案 主键使用规则&#xff1a; 表头值不允许重复&#xff0c;不允许赋NULL值一个表中只能有一个primary…...

探究前端路由hash和history的实现原理(包教包会)

今天我们来讲一讲前端中很重要的一个部分路由&#xff08;router&#xff09;&#xff0c;想必前端小伙伴对‘路由’一词都不会感到陌生。但是如果哪天面试官问你&#xff0c;能大概说一说前端路由的实现原理吗&#xff1f; 你又会如何应对呢&#xff1f; 今天勇宝就带着大家一…...

幻兽帕鲁服务器多少钱?有买过的吗?

幻兽帕鲁服务器多少钱&#xff1f;太卷了&#xff0c;降价到24元1个月&#xff0c;阿里云4核16G10M游戏服务器26元1个月、149元半年&#xff0c;腾讯云4核16G游戏服务器32元、312元一年&#xff0c;华为云26元&#xff0c;京东云主机也是26元起。云服务器吧yunfuwuqiba.com给大…...

MCU独立按键单控LED实现

##江科大视频学习&#xff0c;并且对具体的一些小细节进行更详细的分析。 什么是独立按键&#xff1f; 轻触按键:相当于是一种电子开关&#xff0c;按下开头接通&#xff0c;松开时开头断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 注意…...

[数据集][目标检测]游泳者溺水数据集VOC+YOLO格式2类别895张

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;895 标注数量(xml文件个数)&#xff1a…...

2402C++,C++使用单链列表

原文 #include <windows.h> #include <malloc.h> #include <stdio.h>//用于列表项的结构;第一个成员是SLIST_ENTRY结构,其他成员是数据.在此,数据只是测试 typedef struct _PROGRAM_ITEM {SLIST_ENTRY ItemEntry;ULONG Signature; } PROGRAM_ITEM, *PPROGR…...

《Docker极简教程》--Docker服务管理和监控--Docker服务的监控

Docker监控的必要性在于确保容器化环境的稳定性、性能和安全性。以下是几个关键原因&#xff1a; 性能优化和故障排除&#xff1a;监控可以帮助识别容器化应用程序的性能问题&#xff0c;并快速进行故障排除。通过监控关键指标&#xff0c;如CPU利用率、内存使用、网络流量等&…...

C++初阶 | [八] (下) vector 模拟实现

摘要&#xff1a;vector 模拟实现讲解&#xff08;附代码示例&#xff09;&#xff0c;隐藏的浅拷贝&#xff0c;迭代器失效 在进行 vector 的模拟实现之前&#xff0c;我们先粗略浏览一下 stl_vector.h 文件中的源码来确定模拟实现的大体框架。 这里提供一些粗略浏览源码的技巧…...

信息安全计划

任何管理人员或人力资源专业人士都知道&#xff0c;除非彻底记录标准和实践&#xff0c;否则永远无法真正实施和执行标准和实践。正如您可能想象的那样&#xff0c;在保护您的网络、技术和数据系统免受网络威胁以及在发生这些事件时规划最及时、高效和有效的响应时&#xff0c;…...

终极指南:8大网盘直链下载助手完整解决方案

终极指南&#xff1a;8大网盘直链下载助手完整解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷…...

别急着扔!华硕A555L老本升级实战:加内存、换系统,让它再战三年

华硕A555L老本重生指南&#xff1a;低成本升级方案与实战技巧 当手头的笔记本电脑开始力不从心&#xff0c;大多数人第一反应可能是"该换新机了"。但别急着把旧笔记本送进回收站——特别是像华硕A555L这样的机型&#xff0c;通过精准的硬件升级和系统优化&#xff0c…...

OpenSpec 技术架构深度解析:规范驱动 AI 编程的工程化实践

随着大语言模型(LLM)能力的飞跃式提升,AI 编程助手已经从概念走向生产。Claude Code、Cursor、Copilot 等工具让开发者能够通过自然语言指令快速生成代码,极大地提升了开发效率。然而,这种"氛围编程"(Vibe Coding)模式在带来便利的同时,也暴露出严重的工程化…...

RoboMaster客户端UI绘制避坑指南:从串口协议到服务器调试,手把手教你显示第一条线

RoboMaster客户端UI绘制实战&#xff1a;从协议解析到动态调试的全链路指南 去年备赛期间&#xff0c;我们战队连续三天卡在UI显示问题上——明明协议封装正确&#xff0c;裁判系统指示灯正常&#xff0c;客户端却始终一片空白。直到凌晨三点才发现&#xff0c;原来是服务器端口…...

不止美化:用OhMyPosh和Windows Terminal打造你的高效开发工作流

不止美化&#xff1a;用OhMyPosh和Windows Terminal打造你的高效开发工作流 每次打开终端&#xff0c;你是否也厌倦了那个灰暗单调的默认界面&#xff1f;作为一名开发者&#xff0c;我们每天有超过60%的时间都在与命令行打交道。一个精心配置的终端环境&#xff0c;绝不仅仅是…...

别再手动改编号了!Word题注+交叉引用保姆级教程,论文排版效率翻倍

Word自动化排版&#xff1a;题注与交叉引用全攻略 写论文最崩溃的时刻是什么&#xff1f;当你调整了第37张图片的位置&#xff0c;却发现要手动修改后面63处引用编号的时候。这不是夸张&#xff0c;而是许多学术工作者真实的噩梦。手动编号不仅消耗时间&#xff0c;更会在反复修…...

qPCR实验翻车实录:从扩增曲线异常到熔解曲线双峰,我踩过的坑和填坑指南

qPCR实验翻车实录&#xff1a;从扩增曲线异常到熔解曲线双峰&#xff0c;我踩过的坑和填坑指南 凌晨三点的实验室&#xff0c;qPCR仪嗡嗡作响&#xff0c;屏幕上那条扭曲的扩增曲线仿佛在嘲笑我的徒劳。这是本周第三次重复实验&#xff0c;熔解曲线依然倔强地分裂成双峰。作为刚…...

别再手动重启了!用Systemd守护你的Sentinel控制台(Linux Ubuntu/CentOS保姆级配置)

别再手动重启了&#xff01;用Systemd守护你的Sentinel控制台&#xff08;Linux Ubuntu/CentOS保姆级配置&#xff09; 在分布式系统的世界里&#xff0c;服务的稳定性往往决定了业务的连续性。想象一下凌晨三点被报警叫醒&#xff0c;发现核心流量管控系统因为一个简单的进程崩…...

STM32F4串口接收ATGM336H GPS数据,手把手教你解析NMEA协议并转换经纬度格式

STM32F4与ATGM336H GPS模块实战&#xff1a;从硬件连接到NMEA协议解析 当你第一次拿到ATGM336H GPS模块和STM32F4开发板时&#xff0c;可能会对如何获取准确的经纬度数据感到困惑。本文将带你从硬件连接到软件解析&#xff0c;一步步实现GPS数据的完整处理流程。不同于简单的数…...

别急着改java.security!排查JDBC连SQL Server报TLS错误的3个更优思路

别急着改java.security&#xff01;排查JDBC连SQL Server报TLS错误的3个更优思路 当你在使用JDBC连接SQL Server时遇到"The server selected protocol version TLS10 is not accepted by client preferences"的错误&#xff0c;大多数技术文章会直接建议你修改java.s…...