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

记录 | WPF基础学习MVVM例子讲解1

目录

  • 前言
  • 一、NotificationObject与数据属性
    • 创建个类,声明NotificationObject
  • 二、DelegateCommand与命令属性
  • 三、View与ViewModel的交互(难点)
    • 在ViewModel文件下创建MainWindowViewModel
    • 数据和方法绑定
    • 资源指定
  • 代码下载
  • 四、优势体现
  • 代码下载
  • 更新时间


前言

参考文章:
参考视频:《深入浅出WPF》系列高清视频教程 | 讲师:刘铁猛

自己的感想


在这里插入图片描述

一、NotificationObject与数据属性

创建个类,声明NotificationObject

用于双向的数据绑定

在这里插入图片描述

internal class NotificationObject : INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;public void RaisePropertyChange(string propertyName){if(this.PropertyChanged != null){this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));}}
}

PropertyChanged 事件:订阅者(如 UI 控件)通过监听此事件感知属性变化。

RaisePropertyChange 方法:手动触发事件,传递发生变更的属性名。

上面的RaisePropertyChange()方法可以优化:

public void RaisePropertyChange(string propertyName)
{PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

二、DelegateCommand与命令属性

做操作传输的命令属性命名为DelegateCommand
CanExecute决定命令是否可用
Execute执行命令的实际逻辑
CanExecuteChanged在命令的可执行状态变化时通知UI更新。

在这里插入图片描述

    internal class DelegateCommand : ICommand{public event EventHandler CanExecuteChanged;public bool CanExecute(object parameter){if (this.CanExecuteFunc == null){return true;}return this.CanExecuteFunc(parameter); }public void Execute(object parameter){if (this.ExecuteAction == null){return;}this.ExecuteAction(parameter);}public Action<object> ExecuteAction { get;set; }public Func<object,bool> CanExecuteFunc { get; set; }}

三、View与ViewModel的交互(难点)

NotificaitonObject.cs是ViewModel文件夹中类的基类。里面的其他类都要继承NotificationObject.cs类。

在ViewModel文件下创建MainWindowViewModel

   internal class MainWindowViewModel : NotificationObject{//三个数据属性private double input1;public double Input1{get { return input1; }set { input1 = value; this.RaisePropertyChange("Input1"); }}private double input2;public double Input2{get { return input2; }set { input2 = value; this.RaisePropertyChange("Input2"); }}private double result;public double Result{get { return result; }set { result = value; this.RaisePropertyChange("Result"); }}//1个方法public DelegateCommand AddCommand {  get; set; }private void Add(Object parameter){this.Result = this.Input1 + this.Input2;}public MainWindowViewModel(){this.AddCommand = new DelegateCommand();this.AddCommand.ExecuteAction = new Action<object>(this.Add);}}

数据和方法绑定

在这里插入图片描述

    <Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Button x:Name="btnSave" Content="Save"/><Grid Grid.Row="1"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><TextBox x:Name="slider1" Grid.Row="0" FontSize="24" Margin="4" Background="LightBlue"Text="{Binding Input1}"/><TextBox x:Name="slider2" Grid.Row="1" FontSize="24" Margin="4"Background="LightBlue"Text="{Binding Input2}"/><TextBox x:Name="slider3" Grid.Row="2" FontSize="24" Margin="4"Background="LightBlue"Text="{Binding Result}"/><Button Name="addBtn" Grid.Row="3" Content="Add" Width="120" Height="80" Command="{Binding AddCommand}" /></Grid></Grid>

资源指定

在这里插入图片描述

        public MainWindow(){InitializeComponent();this.DataContext = new MainWindowViewModel();}

代码下载

代码下载

四、优势体现

这种框架的优势体现在:逻辑功能不变的情况下,前端怎么改都可以很快实现功能,只要映射回原来的方法和属性即可。
下面就是直接将前端UI代码拷贝进来,后端不变,效果依旧是result = input1+input2.
在这里插入图片描述
在这里插入图片描述

代码下载

代码下载


更新时间

  • 2025-02-11:创建。
  • 2025-02-12:完善案例。

相关文章:

记录 | WPF基础学习MVVM例子讲解1

目录 前言一、NotificationObject与数据属性创建个类&#xff0c;声明NotificationObject 二、DelegateCommand与命令属性三、View与ViewModel的交互&#xff08;难点&#xff09;在ViewModel文件下创建MainWindowViewModel数据和方法绑定资源指定 代码下载四、优势体现代码下载…...

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…...

实验7 路由器之间IPsec VPN配置

实验7 路由器之间IPsec VPN配置 1.实验目的 通过在两台路由器之间配置IPsec VPN连接&#xff0c;掌握IPsec VPN配置方法&#xff0c;加深对IPsec协议的理解。 2.实验内容 &#xff08;1&#xff09;按照实验拓扑搭建实验环境。 &#xff08;2&#xff09;在路由器R1和R4配置IP…...

Unity中快速制作2D沙雕动画:流程编

Unity中快速制作2D沙雕动画&#xff08;搞笑/无厘头风格&#xff09;&#xff0c;通过以下方案实现低成本、高成效的开发流程&#xff0c;结合夸张的动作、滑稽的物理效果和魔性音效&#xff1a; 1. 角色与素材设计 核心原则&#xff1a;丑萌即正义&#xff0c;越怪越好&#…...

小白零基础如何搭建CNN

1.卷积层 在PyTorch中针对卷积操作的对象和使用的场景不同&#xff0c;如有1维卷积、2维卷积、 3维卷积与转置卷积&#xff08;可以简单理解为卷积操作的逆操作&#xff09;&#xff0c;但它们的使用方法比较相似&#xff0c;都可以从torch.nn模块中调用&#xff0c;需要调用的…...

【Java八股文】01-Java基础面试篇

【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象&#xff0c;什么是封装继承多态&#xff1f;多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…...

k8s部署logstash

1. 编写logstash.yaml配置文件 --- apiVersion: v1 kind: Service metadata:name: logstash spec:type: ClusterIPclusterIP: Noneports:- name: logstash-tcpport: 5000targetPort: 5000- name: logstash-beatsport: 5044targetPort: 5044- name: logstash-apiport: 9600targ…...

Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明

项目场景&#xff1a; 有时候加载的地图服务白色区域会露底&#xff0c;导致在三维场景时&#xff0c;露出了三维网格&#xff0c;影响效果&#xff0c;自此&#xff0c;我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示&#xff1a; 解决方案&#xff1a; 提示…...

《qt open3d网格拉普拉斯平滑》

qt open3d网格拉普拉斯平滑 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionFilterLaplacian_triggered();void MainWindow::on_actionFil...

怎么选择免费的SEO排名工具

随着2025年互联网的迅猛发展&#xff0c;越来越多的企业意识到&#xff0c;拥有一个高排名的网站对于品牌曝光和吸引客户至关重要。尤其是通过SEO&#xff08;搜索引擎优化&#xff09;&#xff0c;可以提高网站在搜索引擎中的排名&#xff0c;进而带来更多的自然流量&#xff…...

缓存技术介绍

缓存技术是一种用于提高数据访问速度的技术&#xff0c;通过在快速存储介质&#xff08;如内存&#xff09;中保存频繁访问的数据&#xff0c;从而减少对较慢存储介质&#xff08;如硬盘&#xff09;的访问次数。缓存可以显著提高系统性能&#xff0c;尤其是在处理大量数据或进…...

SSH隧道+Nginx:绿色通道详解(SSH Tunnel+nginx: Green Channel Detailed Explanation)

SSH隧道Nginx&#xff1a;内网资源访问的绿色通道 问题背景 模拟生产环境&#xff0c;使用两层Nginx做反向代理&#xff0c;请求公网IP来访问内网服务器的网站。通过ssh隧道反向代理来实现&#xff0c;重点分析一下nginx反代的基础配置。 实验环境 1、启动内网服务器的tomca…...

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南&#xff1a;JavaGuide &#xff08;Github 收获148k Star&#xff09;。这是我在大三开始准备秋招面试的时候创建的&#xff0c;目前已经持续维护 6 年多了&#xff0c;累计提交了 5600 commit &#xff0c;共有 550 多位贡献者共同参与…...

【c++】四种类型转换形式

【c】四种类型转换形式 编译时: static_cast&#xff08;静态转换&#xff09; const_cast&#xff08;去常性转换&#xff09; reinterpret_cast&#xff08;重新解释转换&#xff0c;直接转换地址&#xff09; 运行时: dynamic_cast&#xff08;动态转换&#xff0c;运行时类…...

Unity 制作2D动画必要准备:启动篇

制作Unity 2D动画需要准备以下内容&#xff1a; 美术素材准备 选择或绘制符合需求的2D精灵图&#xff08;如像素风格角色、场景元素&#xff09;确保素材包含完整动画序列帧&#xff08;如行走/攻击/跳跃等动作分解&#xff09;注意素材尺寸统一性&#xff0c;建议采用网格化排…...

半小时在本地部署DeepSeek的Janus Pro,进行图片分析和文生图

半小时在本地部署DeepSeek的Janus Pro&#xff0c;进行图片分析和文生图 下载Janus Pro源代码下载模型文件创建Python虚拟环境安装依赖包Janus Pro测试运行程序图片分析测试文生图测试使用中文提示词使用英文提示词 测试印象&#xff1a; 整体模型体积较小&#xff0c;个人可以…...

急停信号的含义

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发C#的运动控制程序的时候&#xff0c;一个必要的步骤就是确认设备按钮的急停…...

设置mysql的主从复制模式

mysql设置主从复制模式似乎很容易&#xff0c;关键在于1&#xff09;主库启用二进制日志&#xff0c;2&#xff09;从库将主库设为主库。另外&#xff0c;主从复制&#xff0c;复制些什么&#xff1f;从我现在获得的还很少的经验来看&#xff0c;复制的内容有表&#xff0c;用户…...

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab)

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测&#xff08;Maltab&#xff09; 完整代码私信回复三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测&#xff08;Maltab&#xff09; 一、引言 1、研究背景和意义 在现代数据科学领域&#xff0c;时间序列…...

东方财富Android面试题及参考答案

接口和抽象类的区别是什么? 定义与语法 接口:接口是一种抽象类型,它只包含方法签名、常量定义,方法默认是public、abstract的,常量默认是public、static、final的。接口不能包含实例变量和普通方法的实现。抽象类:抽象类是一种不能被实例化的类,它可以包含抽象方法和具体…...

ArcGIS基础知识之ArcMap基础设置——ArcMap选项:常规选项卡设置及作用

作为一名 GIS 从业者,ArcMap 是我们日常工作中不可或缺的工具。对于初学者来说,掌握 ArcMap 的基础设置是迈向 GIS 分析与制图的第一步。今天,就让我们一起深入了解 ArcMap 选项中常规选项卡的各个设置,帮助大家更好地使用这款强大的软件。 在 ArcMap 中,常规选项卡是用户…...

element-ui时间组件同一个月内选择/30天内选择

element-ui时间组件同一个月内选择/30天内选择 同一个月 <el-date-picker v-model"time" type"datetimerange"range-separator"至" start-placeholder"开始时间"value-format"timestamp" :picker-options"pickerO…...

Linux Media 子系统 V4l2

一 创建 V4l2 的 entity 在Linux内核的Media Controller框架中&#xff0c;V4L2设备作为实体&#xff08;entity&#xff09;的注册过程涉及以下步骤&#xff1a; 1. 初始化Media Controller结构 驱动首先创建一个media_device实例&#xff0c;并与V4L2设备&#xff08;如v4…...

14,.左下角的值,路径和,由序列确定树

找树左下角的值 迭代法 层序遍历 class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> qu;qu.push(root);TreeNode* leftqu.front();while(!qu.empty()){int szqu.size();leftqu.front();for(int i0;i<sz;i){TreeNode* curqu.fron…...

RabbitMQ 如何设置限流?

RabbitMQ 的限流&#xff08;流量控制&#xff09;主要依赖于 QoS&#xff08;Quality of Service&#xff09; 机制&#xff0c;即 prefetch count 参数。这个参数控制每个消费者一次最多能获取多少条未确认的消息&#xff0c;从而避免某个消费者被大量消息压垮。 1. RabbitMQ…...

Python常见面试题的详解3

1. 类和对象的区别、对象访问类的方法、创建对象时的操作 类和对象的区别&#xff1a;类是一种抽象的概念&#xff0c;它定义了一组具有相同属性和方法的对象的蓝图或模板。而对象是类的具体实例&#xff0c;是根据类创建出来的实体&#xff0c;每个对象都有自己独立的状态&am…...

【推理llm论文精读】DeepSeek V3技术论文_精工见效果

先附上原始论文和效果对比https://arxiv.org/pdf/2412.19437 摘要 (Abstract) DeepSeek-V3是DeepSeek-AI团队推出的最新力作&#xff0c;一个强大的混合专家&#xff08;Mixture-of-Experts&#xff0c;MoE&#xff09;语言模型。它拥有671B的总参数量&#xff0c;但每个tok…...

python自动化测试之Pytest框架之YAML详解以及Parametrize数据驱动!

一、YAML详解 YAML是一种数据类型&#xff0c;它能够和JSON数据相互转化&#xff0c;它本身也是有很多数据类型可以满足我们接口 的参数类型&#xff0c;扩展名可以是.yml或.yaml 作用&#xff1a; 1.全局配置文件 基础路径&#xff0c;数据库信息&#xff0c;账号信息&…...

DeepSeek 本地部署指南

在人工智能飞速发展的今天&#xff0c;大语言模型的应用越来越广泛。DeepSeek 作为一款强大的大语言模型&#xff0c;具备出色的语言理解和生成能力。然而&#xff0c;许多用户希望能够在本地部署 DeepSeek&#xff0c;以实现更高的隐私性、更低的延迟和更好的定制化。本文将为…...

[LeetCode]day21 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;答案中不可以包含重复…...