当前位置: 首页 > 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…...

小新 Pad Pro 2022 投屏新姿势|ZUI14 小组件一键镜像,效率直接拉满

很多联想小新平板用户都知道系统自带投屏功能&#xff0c;但很少有人留意到ZUI14 里藏着一个超便捷的小组件投屏入口&#xff0c;不用翻设置、不用等搜索&#xff0c;桌面点一下就能快速投屏&#xff0c;特别适合日常办公、学习、演示等高频场景。今天分享来自联想官方知识库的…...

容器镜像加速实战:3种方案彻底解决国内拉取难题

容器镜像加速实战&#xff1a;3种方案彻底解决国内拉取难题 【免费下载链接】public-image-mirror 很多镜像都在国外。比如 gcr 。国内下载很慢&#xff0c;需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。 项目地址: https://gitcode.com/GitHub_Trending/pu…...

WhatsNew vs 其他更新提示库:为什么它是iOS开发者的首选

WhatsNew vs 其他更新提示库&#xff1a;为什么它是iOS开发者的首选 【免费下载链接】WhatsNew Showcase new features after an app update similar to Pages, Numbers and Keynote. 项目地址: https://gitcode.com/gh_mirrors/wh/WhatsNew 在iOS应用开发中&#xff0c…...

液冷及前沿散热技术的理论分析:从宏观系统到芯片级散热的范式跃迁

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 211、985硕士&#xff0c;从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作&#xff0c;涉足消费电子、新能源、医疗设备、制药信息化、核工业等…...

Maxwell 磁芯损耗模型怎么选?Power Ferrite vs B-P Curve

🔖 开篇一句话总结 Power Ferrite:用斯坦梅茨公式算损耗,简单高效,适合标准铁氧体材料快速估算。 B-P Curve:直接用实测数据点插值,精度更高,适合非标准材料或追求极致仿真的场景。 一、底层逻辑有什么不一样? 🔹 Power Ferrite:公式拟合的 “标准模板” 它基于经…...

JWT签名爆破原理与Python手写实战

1. 这不是“黑客教程”&#xff0c;而是一次JWT安全边界的实操测绘 JWT&#xff08;JSON Web Token&#xff09;在现代Web系统中几乎无处不在——登录态维持、API鉴权、微服务间信任传递&#xff0c;它用一行紧凑的Base64Url编码字符串承载着本该被严格保护的身份凭证。但很多…...

Unity碰撞器性能优化:Collider类型选择与物理系统调优

1. 为什么一个“看不见”的组件&#xff0c;能让帧率从60掉到20&#xff1f;在Unity项目上线前的性能压测阶段&#xff0c;我遇到过最让人头皮发麻的场景不是Shader报错&#xff0c;也不是内存泄漏&#xff0c;而是——主角刚跑进森林&#xff0c;帧率瞬间从58fps断崖式跌到18f…...

[实战] 制造业质量控制中气泡图(Balloon Drawing)的标准化生成与检验计划集成

前言&#xff1a;2026 年质量管理的数字化底座在 2026 年的数字化工厂环境环境下&#xff0c;质量管理已从被动拦截转向主动预防。作为 FAI&#xff08;首件检验&#xff09;和 PPAP&#xff08;生产件批准程序&#xff09;流程中的核心环节&#xff0c;气泡图&#xff08;Ball…...

手把手教你用AD9834 DDS模块DIY一个可调信号源(附AD原理图/PCB/程序)

从零构建AD9834 DDS可调信号源&#xff1a;硬件搭建与软件调优全指南 在电子设计与射频实验中&#xff0c;一个稳定可靠的可调信号源是不可或缺的工具。商用信号发生器往往价格昂贵&#xff0c;而基于AD9834 DDS模块的DIY方案&#xff0c;能以极低成本实现0-10MHz频率范围内的高…...

IPD咨询洞察:企业前后端为什么总是拧巴?IPD给出了答案

很多企业有一个共同的困境&#xff1a;执行力不差&#xff0c;但结果总差那么一口气。产品做出来了&#xff0c;却没有竞争力&#xff1b;战略定下来了&#xff0c;却落不到产品上&#xff1b;研发埋头苦干&#xff0c;市场却说卖不动——前端和后端始终拧巴&#xff0c;内耗比…...