WPF —— MVVM架构

 1 什么是MVVM?

MVVM是一种软件架构模式,它将应用程序分为三个层次 model(数据模型),view(视图),viewmodel(视图模型)

model:表示应用程序当中数据和业务逻辑,通俗来说就是对象。例如学生的姓名和年龄等放到一个class里面,作为一个对象
view:就是xaml文件,处理用户交互和展示数据的 交互就是事件click,展示就是数据绑定等
viewmodel:数据和页面之间的桥梁,可以处理一些ui逻辑,也可以处理数据绑定,可以执行ui界面的命令(类似于事件)
也可以处理ui界面事件。
三者之间的关系 view对应一个viewmodel,一个viewmodel对应N个model,
mvvm核心特点数据驱动视图,通过修改数据达到更新界面的效果 

2 MVVM和WPF关系?

WPF带来的技术有数据绑定,Binding(绑定)、依赖属性、RoutedEvent(路由事件) 、Command指令
DataTemplate数据模版、ControlTemple控件模版等技术
这些技术就可以实现mvvm设计需求。

3 MVVM优势?

1.降低view和model之间的耦合度。
2.提高代码的重用性和可维护性。
3.简化了单元测试 
4.支持双向绑定,数据可以更改界面,界面更新也会影响数据
5 利用wpf里面强大的特性

4 wpf实现mvvm设计模式 需要知识点

  1INotifyPropertyChanged,我们在使用Binding绑定数据时候,通过修改数据不会达到界面更新的效果,原因

就是在数据变化没有发出通知,所以可以这个接口检查到属性变化之后发出通知。

   2ICommand:wpf一种机制,类似于事件绑定,但是又和事件绑定有区别,
   例如有几个页面需要绑定点击的时候关闭窗体的功能,如果是采用事件绑定,可以在每一个页面添加绑定,
  命令可以写在其他类里面,由不同窗体进行调用
  事件绑定具有局限性,
  命令系统内置一部分的命令 ,内置的指令有复制 粘贴、剪切等指令 也可以通过ICommand创建一个命令
<Button Command="WindowCommands.Close"/>

MVVM概念

设置WPF界面

<TextBlock Text="{Binding Name1}" Width="100" Height="40" Margin="0,-100,0,0"></TextBlock>
<TextBlock Text="{Binding Sex}"Width="100"Height="40"></TextBlock>
<ComboBox ItemsSource="{Binding Names}"Name="c1"Width="100"Height="40"Margin="0,100,0,0">
</ComboBox>
<Button Width="100" Height="40" Margin="0,-200,0,0" Click="f1">点击更新数据</Button>

创建类继承INotifyPropertyChanged

public partial class MainWindow : Window, INotifyPropertyChanged

/2实现接口方法

public event PropertyChangedEventHandler PropertyChanged;

3 定义属性在set调用方法,发出通知

private string name = "乔峰";
public string Name1
{get{return name;}set{name = value;PropertyChanged(this, new PropertyChangedEventArgs("Name1"));}
}public bool Sex { get;set; } = true; //属性的更改不会触发界面更新private ObservableCollection<string> names = new ObservableCollection<string> { "乔峰", "段誉", "虚竹" };public ObservableCollection<string> Names {get{return names;}set{names = value;PropertyChanged(this, new PropertyChangedEventArgs("Names"));}}

Button的事件

private void f1(object sender, RoutedEventArgs e)
{Name1 = "李四"; //可以达到界面更新的目的Sex = false; // 不可以达到界面更新的目的Names.Add("王大拿");// 数组里面是有的,不可以达到界面更新的效果// List添加等操作不可以达到界面更新的效果.,把集合定义成List改成ObservableCollection这种类型}

效果图如下

更新数据前

更新数据后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud之Feign集成Ribbon

Feign定义【可跳过】 Spring Cloud Feign是一个声明式的伪Http客户端&#xff0c;它使得写Http客户端变得更简单。其英文表意为“假装&#xff0c;伪装&#xff0c;变形”&#xff0c;是一个http请求调用的轻量级框架&#xff0c;可以以Java接口注解的方式调用Http请求&#x…

IDM下载器_Internet Download Manager 6.42.7

网盘下载 IDM下载器是一款针对互联网所打造的下载管理器。IDM下载器能将下载速度提高5倍&#xff0c;恢复因丢失的连接&#xff0c;网络问题&#xff0c;计算机关闭或意外断电而重新启动中断或中断的下载。IDM下载器还可支持所有流行的浏览器&#xff0c;以使用独特的“高级浏…

视频改字祝福 豪车装X系统源码uniapp前端源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 uniapp视频改字祝福 豪车装X系统源码 全开源。 创意无限&#xff01;AI视频改字祝福&#xff0c;豪车装X系统源码开源&#xff0c;打造个性化祝福视频不再难&#xff01; 想要为你的…

RealSenseSR300工程环境配置说明

新建目录结构如下&#xff1a; output:存储可执行文件.exe等src:存储源码.cpp .h等3rdparty:存储第三方库 opencv等 其中将源码按照main及其相关文件分为以下三类 vs2015许可证到期后先激活&#xff0c;激活码很多网上有&#xff0c;如&#xff1a;HMGNV-WCYXV-X7G9W-YCX63…

2024.4.25

#include <iostream> #include <iomanip> using namespace std; class Person{const string name;int age;char sex; public:Person(const string name):name(name){cout << "第一个Person构造函数" << endl;}Person():name("zhangsan&…

3.7设计模式——Observer 观察者模式(行为型)

意图 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于他的对象都得到通知并被自动更新。 结构 Subject&#xff08;目标&#xff09;知道它的观察者&#xff0c;可以有任意多个观察者观察同一个目标&#xff0c;提供注册和删…

快速入门基础控制台API

目录 一、什么是win32API 二、API基础函数介绍 2.1控制台基础命令 2.1.1标题修改 2.1.2长宽修改 2.1.3坐标 2.2GetStdHandle 2.3GetConsoleCursorInfo 2.4SetConsoleCursorInfo 2.5SetConsoleCursorPosition 2.6GetAsyncKeyState 三、API函数综合应用 3.1设置光标…

IDEA-关于idea在import类时,代码报红的解决方法,找不到包

关于idea在import类时&#xff0c;代码报红的解决方法_idea import报红-CSDN博客

软件企业质量保证的基石――QA,QC的良性协作

软件企业质量保证的基石――QA、QC的良性协作 国内的软件产业发展了20多年的时间&#xff0c;已经由个人英雄时代步入到中、小团队协作时代。相信不久的将来&#xff0c;国内一定会出现航母级的软件企业&#xff0c;那时候我们会迎来集团军作战的时代。不同的时代表明软件规模…

Pandas 2.2 中文官方教程和指南(二十五·二)

新列 使用 DataFrame.map&#xff08;以前称为 applymap&#xff09;高效动态创建新列 In [53]: df pd.DataFrame({"AAA": [1, 2, 1, 3], "BBB": [1, 1, 2, 2], "CCC": [2, 1, 3, 1]})In [54]: df Out[54]: AAA BBB CCC 0 1 1 2 1…

用html写一个旋转菜单

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>旋转菜单</title><link relstylesheet href"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css"&…

Linux操作

一&#xff1a;各类操作快捷键 Ctrl c强制停止程序运行用于删除命令&#xff0c;执行出错时使用Ctrl d退出或者登出用于退出Linux账户 | 退出Linux自带的Python模式(命令框输入&#xff1a;python进入)history查看历史命令用于查看历史命令Ctrl r历史命令搜索进入后面在 内…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

分享6款嵌入式常见的GUI,不要错过

大家好&#xff0c;我是知微&#xff01; 先来聊聊什么是GUI。图形用户界面&#xff08;Graphical User Interface&#xff0c;简称 GUI&#xff09;采用直观的图形方式展示&#xff0c;让用户与计算机或设备交流变得简单直观。不仅工作效率得到极大提升&#xff0c;用户体验也…

普通人也可以在抖音上开店卖货了,还有多少人不知道!

大家好&#xff0c;我是电商糖果 在抖音上开网店卖货最近几年特别火&#xff0c;我想只要是稍微了解电商创业的朋友都知道。 就当你没有创业做电商的想法&#xff0c;你只要有网购的习惯&#xff0c;就会发现抖音上购买商品非常的方便。 而且身边的同事&#xff0c;朋友也都…

全新G级越野车家族领衔 梅赛德斯-奔驰携强劲实力阵容和前瞻数字科技亮相2024北京车展

全新纯电G级越野车、G 500和AMG G 63亮相&#xff0c;油电双雄带来G级越野车的多元选择CLA级概念车携MMA平台及MB.OS构建奔驰电动化、数字化的未来&#xff0c;定义新生代电动风潮全新AMG GT 63 S E PERFORMANCE车展亮相&#xff0c;以F1技术打造“史上最快AMG量产车”“迈巴赫…

Vue2 —— 学习(十)

目录 一、vue-resource 库 二、插槽 &#xff08;一&#xff09;默认插槽 &#xff08;二&#xff09;具名插槽 &#xff08;三&#xff09;作用域插槽 三、vuex &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;多组件共享数据 1.通过全局事件总线实现 2…

【virtuoso】 PDK

什么是PDK&#xff1f; PDK( Process Design Kit )&#xff0c;工程设计数据包&#xff0c;是芯片厂家foundary提供给IC设计公司的有关制造工艺的模型和EDA工具支持。是连接IC制造公司&#xff0c;IC设计公司的桥梁。 PDK包含内容&#xff1a; 器件模型 SPICE模型模型 与 测量误…

Nodejs--异步编程

异步编程 函数式编程 高阶函数 在通常的语言中&#xff0c;函数的参数只接受基本的数据类型或者是对象引用&#xff0c;返回值只能是基本数据类型和对象引用。 function foo(x) {return x }高阶函数是把函数作为参数&#xff0c;将函数作为返回值的函数 function foo(x) {…

最好的电脑监控软件,监控员工的软件哪个好用

经过对百度AI的询问&#xff0c;最好的电脑监控软件是安企神&#xff0c;因为它排名第一位。 经过对AI的详细询问&#xff0c;它给出了选择安企神作为电脑监控软件的十个理&#xff1a; 获取试用版找客服 1.全面的监控功能 安企神软件提供了屏幕监控、键盘记录、文件操作记录…