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

WPF中MVVM和MVVMLight模式

MVVM模式是一种软件架构模式,用于分隔视图(View)、视图模型(ViewModel)和模型(Model)之间的逻辑,从而简化代码、降低依赖,提高可维护性和可测试性。MVVMlight是一个轻量级的MVVM框架,它提供了简化MVVM模式实现的工具和类库,使得开发者可以更加专注于业务逻辑的实现。接下来将详细解释标题和描述中提到的各个知识点。

首先,让我们了解一下MVVM模式的基本构成:

1. Model(模型):
模型层负责定义数据结构,即应用程序中的数据对象。它通常包含数据的属性和属性值,以及用于操作这些数据的方法。在MVVM模式中,Model是与UI无关的数据实体,它通过属性公开数据,这些属性通常会实现INotifyPropertyChanged接口,以支持数据变更通知。当数据改变时,这种通知机制能够让视图层(View)自动更新。

2. ViewModel(视图模型):
ViewModel层的作用是作为Model和View之间的桥梁,它包含了操作数据的逻辑,例如数据的增加、删除、修改和查询等算法操作。ViewModel通常会继承自特定的基类(如MVVMlight中的ViewModelBase),这样可以利用框架提供的功能,如属性变更通知、命令绑定等。ViewModel中还常常定义一个ObservableCollection类型的集合来管理数据项,这个集合会自动通知视图层数据变更,让视图层能够响应数据的变化。

3. View(视图):
View层是用户界面层,它不包含业务逻辑代码,而只负责数据的展现和用户交互。在MVVM模式下,View会绑定到ViewModel层的数据和命令,实现数据的显示、编辑、新增和删除等功能。

描述中还提到了面向对象的概念:

面向对象=对象+对象之间关系
这一概念强调了在面向对象编程中,对象以及对象之间的相互作用和关联是核心内容。对象是由状态(属性)和行为(方法)构成的实例,而对象之间的关系则包括了继承、关联、依赖和聚合等。

具体到本例的MVVM模式应用,结合MVVMlight框架,其关键知识点可以进一步展开:

1. 实现接口INotifyPropertyChanged:
这个接口是.NET框架提供的用于实现属性变更通知的标准接口。当Model层的属性值发生变化时,实现此接口的属性需要触发PropertyChanged事件,以便通知绑定的视图进行更新。

注:如果没有引用MVVMlight要实现属性通知更改是要继承INotifyPropertyChanged:

  internal abstract class ViewModelBase : INotifyPropertyChanged{public void OnPropertyChanged(string propName){// 触发通知的事件// 参数1:触发通知的对象// 参数2:事件对象,告诉UI哪个属性发生了变化PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));}// 实现INotifyPropertyChanged接口public event PropertyChangedEventHandler PropertyChanged;}private string name;public string Name{get { return name; }set{name = value;//onPropertyChanged("Name");OnPropertyChanged(nameof(Name));}}

2. 继承ViewModelBase:
在MVVMlight框架中,ViewModelBase是一个基础类,提供了一些重要的功能,比如自动跟踪属性变更、支持数据绑定和命令绑定等。继承这个类可以简化ViewModel的实现,开发者不需要自己实现INotifyPropertyChanged接口。

  private string name = "张三";public string Name{get { return name; }set{name = value;// 属性变化时,进行通知RaisePropertyChanged(nameof(Name));}}

3. 定义一个集合ObservableCollection<c401xmmc> C401xmmcs:
ObservableCollection是一个支持自动通知的集合,当集合中的元素被添加、删除或整个集合被刷新时,它会通知绑定的视图进行更新。这对于实现动态数据界面非常有用。

最后,提到的"压缩包子文件的文件名称列表"中的"SLUseMVVMLight2"可能是实际项目中用于实践MVVM模式结合MVVMlight框架的一个示例或实验名称。

在实践中,MVVM模式和MVVMlight框架可以极大地提高软件的可维护性、可测试性和复用性,尤其是在大型项目和团队协作中优势更加明显。开发者可以更加聚焦于业务逻辑的实现,而不必担心界面的复杂交互和数据的同步问题。

当我们使用MVVMlight之后我们的cs后台就不需要再写代码了 都在相对应的ViewModel写一些逻辑代码 还有我们的DateConext数据上下文

以上就是列子

命令

MVVM

internal class MyCommand : ICommand
{Action action;Func<bool> canRun;public MyCommand(Action _action, Func<bool> _canRun){action = _action;canRun = _canRun;}public void OnCanExecuteChanged(){// 参数1:谁触发的// 参数2:参数对象CanExecuteChanged?.Invoke(this, EventArgs.Empty);}// 当命令的可执行状态变化时,应该触发这个事件(通知一下界面)public event EventHandler CanExecuteChanged;// 确定当前命令是否可以被执行,返回true表示可以执行   返回false表示不能被执行public bool CanExecute(object parameter){Console.WriteLine("判断当前的命令是否可以被执行");// 运行委托,并返回委托的返回值,以确定命令的可执行状态return canRun();}// 当命令被触发时执行的方法public void Execute(object parameter){Console.WriteLine("执行命令");// 执行传递进来的委托action?.Invoke();}
}

还需要在new 在传递方法

// 1、在vm中创建一个命令
// 命令就是一个对象,这个对象必须实现 ICommand 接口
public MyCommand WoDeMingLing { get; set; }private void fn1()
{Console.WriteLine("fn1");
}private bool fn1CanRun()
{return false;
}public MainViewModel(){WoDeMingLing = new MyCommand(fn1, fn1CanRun);}

而且当使用了MVVMLight之后可以不需要再继承ICommand  

RelayCommand

  /// <summary>/// 关闭窗体/// </summary>public RelayCommand<Window> CloseUnitCommand{get{return new RelayCommand<Window>((arg) =>{if (arg == null) return;arg.Close();});}}/// <summary>/// 添加新的物资类型/// </summary>public RelayCommand<Window> AddUnitTypeCommand{get{return new RelayCommand<Window>((arg) =>{if (string.IsNullOrEmpty(unitType.Name)) return;.........if (count == 0){MessageBox.Show("添加失败");}else{arg.Close();}});}}

http://www.lryc.cn/news/574155.html

相关文章:

  • 技术逐梦之旅:从C语言到Vue的成长之路
  • 【附源码】考试报名系统设计与实现+SpringBoot + Vue (前后端分离)
  • Java底层原理:深入理解类加载机制与反射
  • 开始读Learning PostgresSQL第二版
  • C# SolidWorks二次开发-实战2,解决SolidWorks2024转step文件名乱码问题
  • STM32和C++ 实现配置文件导入、导出功能
  • 【技术分享】XR技术体系浅析:VR、AR与MR的区别、联系与应用实践
  • 使用CloudFormation模板自动化AWS基础设施的部署
  • 【第二章:机器学习与神经网络概述】03.类算法理论与实践-(2)朴素贝叶斯分类器
  • Auto-GPT vs ReAct:两种智能体思路对决
  • 【MySQL基础】MySQL复合查询全面解析:从基础到高级应用
  • 左神算法之给定一个数组arr,返回其中的数值的差值等于k的子数组有多少个
  • Flask学习笔记
  • Java数据结构第二十四期:探秘 AVL 树,当二叉搜索树学会 “自我调节”
  • 腾讯云 CodeBuddy 技术评估报告(2025年):编码效率提升40%,复杂工程处理能力领先Cursor 35%​
  • 【Java开发日记】我们详细讲解一下 Java 中 new 一个对象的流程
  • Nginx与Tomcat:谁更适合你的服务器?
  • Python 商务数据分析—— NumPy 学习笔记Ⅱ
  • react gsap动画库使用详解之scroll滑动动画
  • 分布式系统 - 分布式锁及实现方案
  • 【开源工具】一键解决使用代理后无法访问浏览器网页问题 - 基于PyQt5的智能代理开关工具开发全攻略
  • 爬虫002-----urllib标准库
  • 企业主动风险管理破局供应链“黑天鹅”,善用期货
  • PDF-XSS
  • 游戏盾高效防范DDoS攻击的安全防护
  • 跨平台是.NET Framework4.5与.NET8的核心区别
  • 用ESP8266+MQTT构建完全属于自己的物联网平台
  • Life:Internship in OnSea Day 1
  • Excel工具箱WPS版 增强插件 文本处理、批量录入 数据对比 高级排序
  • vivado使用非自带的第三方编辑器