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

WPF学习(7) --MVVM模式

1. MVVM模式概述

MVVM模式由三个主要部分组成:

  • Model(模型):包含应用程序的业务逻辑和数据。通常是数据对象和数据访问层。
  • View(视图):用户界面部分,展示数据并与用户进行交互。通常是XAML文件。
  • ViewModel(视图模型):视图与模型之间的桥梁。它从Model中获取数据并准备好让View使用,同时处理用户的交互。

2. MVVM模式在WPF中的实现

2.1 Model   Model: Person.cs

Model通常是数据实体类和数据访问层,可以从数据库或服务中获取数据。下面是一个简单的Model示例:

public class Person
{public string Name { get; set; }public int Age { get; set; }
}

2.2 ViewModel   ViewModel: PersonViewModel.cs

ViewModel负责从Model获取数据并准备好供View使用。ViewModel通常实现INotifyPropertyChanged接口,以便通知View属性值的变化。

using System.ComponentModel;public class PersonViewModel : INotifyPropertyChanged
{private Person _person;public PersonViewModel(){_person = new Person { Name = "John Doe", Age = 30 };}public string Name{get { return _person.Name; }set{if (_person.Name != value){_person.Name = value;OnPropertyChanged("Name");}}}public int Age{get { return _person.Age; }set{if (_person.Age != value){_person.Age = value;OnPropertyChanged("Age");}}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

2.3 View   View: MainWindow.xaml

View是用户界面部分,使用XAML定义界面布局和绑定。下面是一个简单的View示例:

<Window x:Class="MVVMExample.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="200" Width="400"><Grid><StackPanel><TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /><TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" /><TextBlock Text="{Binding Name}" /><TextBlock Text="{Binding Age}" /></StackPanel></Grid>
</Window>

2.4 Code-Behind: MainWindow.xaml.cs

要使绑定工作,需要在窗口的代码后面设置DataContext:

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();DataContext = new PersonViewModel();}
}

相关文章:

WPF学习(7) --MVVM模式

1. MVVM模式概述 MVVM模式由三个主要部分组成&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;包含应用程序的业务逻辑和数据。通常是数据对象和数据访问层。View&#xff08;视图&#xff09;&#xff1a;用户界面部分&#xff0c;展示数据并与用户进行交互。通…...

【人工智能】-- 受限玻尔兹曼机

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;受限玻尔兹曼机 &#x1f348;RBM的结构 &#x1f34d;RBM的架构图 &#x1f34d;RBM的经典实现 &…...

在 Android 中定义和使用自定义属性

1. 定义自定义属性 首先&#xff0c;我们需要在 res/values/attrs.xml 文件中定义自定义属性。这些属性可以是颜色、尺寸、字符串等。 创建或打开 res/values/attrs.xml 文件&#xff0c;并添加以下内容&#xff1a; <?xml version"1.0" encoding"utf-8&…...

【实战:python-Django发送邮件-短信-钉钉通知】

一 Python发送邮件 1.1 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from 306334678qq.com # 发送方邮箱 passwd luzdikipwhjjbibf # 填入发送方邮箱的授权码(填入自己的授权码&#xff0c;相当于邮箱…...

Todo List

待整理的笔记&#xff0c;先列出来&#xff0c;防止后面忘记要整理什么内容。一个一个整理&#xff1a; Linux内核ARM架构(v8)的系统调用的实现过程&#xff1b;open()/write()/read()在Linux内核中的详细实现过程&#xff0c;到驱动中注册的操作集的调用过程&#xff1b;文件…...

【Redis】Redis十大类型

文章目录 前言一、string字符串类型二、List列表类型三、 Hash表四、 Set集合五、 ZSet有序集合六、 GEO地理空间七、 HyperLogLog基数统计八、Bitmap位图九、bitfield位域十、 Stream流10.1 队列指令10.2 消费组指令10.3 ACK机制 前言 redis是k-v键值对进行存储&#xff0c;k…...

存储实验:Linux挂载iscsi硬盘与华为OceanStor创建LUN全流程

目录 目的环境规划实验实验流程Centos配置0. 关闭防火墙1. 设置网卡信息2. 配置路由3. iscsiadm连接存储 iSCSI LUN创建&#xff08;以华为OceanStor为例&#xff09;验证1. 验证是否成功2. 开启自动挂载 目的 实现Linux连接iscsi硬盘&#xff0c;同时实现开机自启挂载 环境规…...

高可用系统架构设计技术方案:Java架构师视角

在现代互联网环境下&#xff0c;高可用性&#xff08;High Availability, HA&#xff09;已成为衡量系统质量的重要指标之一。对于Java架构师而言&#xff0c;设计一套能够保证业务连续性、快速恢复和持续服务的高可用系统架构&#xff0c;是一项复杂而挑战性的任务。本文将从J…...

C++ --> 类和对象(三)

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 前面已经对类和对象有一定的了解&#xff0c;接下来再次深入的了解一下。 一、深入理解构造函数 构造函数体赋值&#xff1a; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能…...

JS【详解】类 class ( ES6 新增语法 )

本质上&#xff0c;类只是一种特殊的函数。 console.log(typeof 某类); //"function"声明类 class 方式 1 – 类声明 class Car {constructor(model, year) {this.model model;this.year year;} }方式 2 – 类表达式 匿名式 const Car class {constructor(mod…...

vue中使用$set方法给对象添加属性

vue中可以使用$set()给对象添加属性&#xff0c;但不是所有的对象都可以使用&#xff0c;vue中api明确说明&#xff0c;它必须用于向响应式对象上添加属性 响应式对象&#xff0c;vue的响应式原理&#xff0c;可以查看&#xff1a;深入响应式原理 — Vue.js ①对象赋值 this…...

【Python】ftplib的使用

仅描述基础要点&#xff0c;备忘。 python自带ftplib库&#xff0c;可实现ftp读写。 1 要点 ftp未使用默认端口21时&#xff0c;需显示指定端口。ftp路径带有中文&#xff0c;可能需要设置ftp的encoding属性为 gbk。ftplib不支持递归创建目录&#xff0c;需手动创建层级目录…...

CSS 【详解】CSS 函数(含 calc,min,max,clamp,cubic-bezier,env,steps 等)

函数描述CSS 版本attr()返回选择元素的属性值。2calc()允许计算 CSS 的属性值&#xff0c;比如动态计算长度值。3cubic-bezier()定义了一个贝塞尔曲线(Cubic Bezier)。3hsl()使用色相、饱和度、亮度来定义颜色。3hsla()使用色相、饱和度、亮度、透明度来定义颜色。3linear-grad…...

简单理解Lua 协程(coroutine)

也许更好的阅读体验 协程简单理解为可以暂停的线程&#xff0c;但是同一时刻只有一个协程可以处于运行状态。 文章目录 coroutine.create()coroutine.resume()coroutine.wrap()coroutine.yield()coroutine.resume()参数传递resume和yield之间互换数据 coroutine.create() lua…...

(day18) leetcode 204.计数质数

描述 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0示例 3…...

SadTalker数字人服务器部署

一、单独SadTalker部署 git clone https://github.com/OpenTalker/SadTalker.gitcd SadTalker conda create -n sadtalker python3.8conda activate sadtalkerpip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pyto…...

Python实现一对多WebSocket发送给指定多个客户端

在一对多的WebSocket场景下&#xff0c;如果你想要向特定的多个客户端发送消息&#xff0c;而不是广播给所有客户端&#xff0c;你需要维护一个能够标识每个客户端的方式&#xff0c;比如使用用户名或者客户端ID。这样&#xff0c;你就可以根据需要选择向哪些客户端发送消息。 …...

Power BI 工具介绍

Power BI是一款商业智能&#xff08;BI&#xff09;软件&#xff0c;由微软开发&#xff0c;旨在帮助用户将复杂的数据转化为视觉化的交互式见解。Power BI提供了一套完整的工具&#xff0c;包括数据连接、数据准备、数据建模、数据分析和数据可视化等功能&#xff0c;使用户能…...

银河麒麟高级服务器操作系统V10加固操作指南

1:检查系统openssh安全配置: 2:检查是否设置口令过期前警告天数: 3:检查账户认证失败次数限制: 修改/etc/pam.d/system-auth文件中deny的参数即可 4:检查是否配置SSH方式账户认证失败次数限制:...

(leetcode学习)15. 三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&a…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...