WPF绑定与通知属性到界面

news/发布时间2024/8/25 19:19:14

绑定与通知属性到界面

本文同时为b站WPF课程的笔记,相关示例代码

前言

在上一篇文章C#代码事件里面,我们介绍了利用给控件命名的方式,在后端代码中访问并修改属性。这样子直截了当,但是这样后端代码依赖于前端。如果前端的代码变动较大,后端代码可能要大面积重构。

于是利用绑定的这种方法,将前后端分离,前端只需把需要修改的属性设置好绑定变量名,后端只需盯着这些变量名进行操作。

这样还可以实现前后端双人开发,后端开发者只需把那些操作的接口名称告诉前端,让对方去绑定相应的空间属性即可。

绑定

控件属性设置为"{Binding xxxx}"

例如绑定文本框的文字内容到UserName

<TextBox Text="{Binding UserName}" Grid.Row="0" Grid.Column="1" Margin="2"/>

在后端中写入:

public string UserName { get; set; }

接下来就可以在后端的代码中直接使用变量UserName

其中get; set;是自动生成了属性的访问器,分别用于获取属性的值与修改属性的值。这是自动实现的属性,不需要手写。

可以输入prop然后按 Tab 键两次,一键生成

public int MyProperty { get; set; }

属性的代码模板,加快了编写常见代码结构的速度。

属性的初值

假如想要程序刚运行的时候,文本框里就已经有文字,可以给绑定的变量赋值:

public string UserName { get; set; } = "333"

但是运行会发现,并没有预期的效果。

可以在窗口的构造函数public MainWindow()中,初始化窗口InitializeComponent();之后,将窗口的 DataContext 设置为窗口本身的实例:

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

在上面的例子中,UserNameMainWindow 的一个属性。通过将 DataContext 设置为 this(即 MainWindow 的当前实例),告诉了数据绑定引擎应该在当前的 MainWindow 实例中查找 UserName 属性。

这样,在 XAML 中使用 {Binding UserName} 的时候,它能正确地找到 MainWindowUserName 属性,并将其与 UI 元素关联起来。

自动更新界面

接下来的后端代码中,即使对于变量UserName做出了修改,前台的界面也不会实时的发生变化。

为了使 WPF 的数据绑定能够响应属性值的变化,并自动更新界面,需要实现 INotifyPropertyChanged 接口。这个接口用于通知数据绑定引擎某个属性的值已经改变,从而引擎可以更新绑定到该属性的 UI 元素。

以下详细说明:

实现INotifyPropertyChanged接口

在这个类(上面的例子中是``MainWindow)中实现 INotifyPropertyChanged接口,需要声明一个PropertyChanged` 事件:

public partial class MainWindow : Window, INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;
}

定义 RaisePropertyChanged 函数:

private void RaisePropertyChanged(string propertyChanged)
{PropertyChangedEventHandler handler = this.PropertyChanged;if (handler != null)handler(this, new PropertyChangedEventArgs(propertyChanged));
}
  • 这个函数用于触发 PropertyChanged 事件。
  • 当某个属性的值被改变时,我们只需要调用这个方法,传递属性的名字作为参数,这样界面就会发生更新。

修改属性以触发 PropertyChanged 事件

private string _UserName = "333";
public string UserName
{get { return _UserName; }set{if (_UserName != value){_UserName = value;RaisePropertyChanged(nameof(UserName));}}
}
  • 对于需要绑定的每个属性,我们就不再使用原本自动实现的属性(原本的是自动生成的,只需要写{ get; set; }就行。
  • 而是,首先需要给每个属性创建一个私有字段(在这个案例中就叫 _UserName)。
  • 在属性的 set 访问器中,我们设置字段的值,并且调用 RaisePropertyChanged 方法,可以达到一旦变量改变,就更新界面的效果。

可以输入propfull然后按 Tab 键两次,一键生成以下代码模板:

private int myVar;public int MyProperty
{get { return myVar; }set { myVar = value; }
}

然后可以根据需要修改类型(int)、字段名(myVar)和属性名(MyProperty)。对于上面的 INotifyPropertyChanged 的情况,还需要在 set 访问器中添加属性值变化通知的代码。

总结

绑定

例如绑定文本框的文字内容到UserName

<TextBox Text="{Binding UserName}"/>

在后端中写入:

public string UserName { get; set; }

可以输入prop使用代码模板。

初值

直接赋值

public string UserName { get; set; }

但是注意将窗口的 DataContext 设置为窗口本身的实例

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

实时更新

声明 PropertyChanged 事件:

public partial class MainWindow : Window, INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;
}

定义 RaisePropertyChanged 函数:

private void RaisePropertyChanged(string propertyChanged)
{PropertyChangedEventHandler handler = this.PropertyChanged;if (handler != null)handler(this, new PropertyChangedEventArgs(propertyChanged));
}

修改属性触发更新事件

private string _UserName = "333";
public string UserName
{get { return _UserName; }set{if (_UserName != value){_UserName = value;RaisePropertyChanged(nameof(UserName));}}
}

可以输入propfull使用代码模板。

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

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

相关文章

PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据|附代码数据

原文链接:http://tecdat.cn/?p=27099 最近我们被客户要求撰写关于蒙特卡罗的研究报告,包括一些图形和统计输出。 金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机(与确定性相反…

每日一图——2024/1/24

每日一图————技多不压身本文来自博客园,作者:{Mr Q},转载请注明原文链接:https://www.cnblogs.com/Layout-QJS/p/17985947

大模型系列|垂直大模型的几种训练策略(一)

大模型系列|垂直大模型的几种训练策略(一) 1 目前垂直行业大模型的几种训练策略 参考:大模型时代-行业落地的再思考重新训练:使用通用数据和领域数据混合,from scratch(从头开始)训练了一个大模型,最典型的代表就是BloombergGPT。 二次预训练:在一个通用模型的基础上…

数据库学习笔记(五)—— MySQL 之 瓶颈及优化篇

MySQL 之 瓶颈及优化篇数据库瓶颈阶段一:企业刚发展的阶段,最简单,一个应用服务器配一个关系型数据库,每次读写数据库。 阶段二:无论是使用 MySQL 还是 Oracle 还是别的关系型数据库,数据库通常不会先成为性能瓶颈,通常随着企业规模的扩大,一台应用服务器扛不住上游过来…

春节期间应该采取什么措施来预防离职员工泄露信息?

春节前后,员工流动性增加,企业确实需要特别关注离职员工可能带来的数据安全风险。离职员工,尤其是那些掌握核心商业秘密或敏感信息的员工,可能在离开公司时有意或无意地带走或泄露这些信息。为了防范这种风险,企业可以采取以下措施:提前预警:对即将离职的员工进行预警,…

硬链接和软连接

1、硬链接 硬连接指通过索引节点号来进行连接。 inode是可以对应多个文件名的在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。 在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。 硬连接…

scikit-learn.datasets 机器学习库

scikit-learn是一个用于Python的机器学习库,提供了大量用于数据挖掘和数据分析的工具。以下是对这些函数和方法的简要描述:clear_data_home: 清除数据集目录的内容。 dump_svmlight_file: 将数据集保存为SVMLight格式的文件。 fetch_20newsgroups: 下载20个新闻组的文本数据集…

数据可视化是如何被企业重视起来的?

数据可视化,作为信息时代的一项重要技术,正在企业中崭露头角,逐渐成为业务决策和运营管理的得力助手。企业之所以对数据可视化如此重视,是因为它为企业带来了诸多实际利益和战略优势。下面我就以可视化从业者的角度来简单聊聊这个话题。首先,数据可视化为企业提供了更直观…

Linux命令

cp [options] source dest或cp [选项] 源文件 目标文件选项说明:-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于 dpR 参数组合。 -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。 -r 或 --recursive:用于…

.NET集成IdGenerator生成分布式全局唯一ID

前言 生成分布式唯一ID的方式有很多种如常见的有UUID、Snowflake(雪花算法)、数据库自增ID、Redis等等,今天我们来讲讲.NET集成IdGenerator生成分布式全局唯一ID。 分布式ID是什么? 分布式ID是一种在分布式系统中生成唯一标识符的方法,用于解决多个节点之间标识符重复或性…

读AI3.0笔记05_人类与机器学习

人类与机器学习1. 人类与机器学习的关键差距 1.1. 老式人工智能使用的是人类程序员对智能行为构建的显性规则 1.2. DNN这种“从数据中学习”的方法已被逐渐证实比“普通的老式人工智能”策略更成功 1.3. ConvNets的学习过程与人类的学习过程并不是很相似 1.3.1. ConvNets在多个…

Axure rp9入门教程

Axure rp9入门图文教程-基操及介绍免费版安装包请点击此处(避免审查,请点击这)[^这里] 一、界面介绍1. 复制、剪切及粘贴区域 2. 选择模式 3. 插入形状 4. 控点(编辑控点) 5. 置顶和置底 6. 组合和取消组合 7. 调整大小 8. 对齐 9. 预览、共享 10. 元件样式 11. 文本设置 …

微信小程序中引用iconfont

1.将下载的iconfont包,解压缩放到assets目录下,并且建立一个iconfont.wxss文件; 2.在app.json文件中引用(全局可用), @import /assets/iconfont/iconfont.wxss; 3.iconfont.wxss内部结构: 如果下面这种情况,不能用@font-face {font-family: "iconfont"; /* P…

P1765 手机

1.题目介绍 手机 题目描述 一般的手机的键盘是这样的:要按出英文字母就必须要按数字键多下。例如要按出 \(\tt x\) 就得按 \(9\) 两下,第一下会出 \(\tt w\),而第二下会把 \(\tt w\) 变成 \(\tt x\)。\(0\) 键按一下会出一个空格。 你的任务是读取若干句只包含英文小写字母和…

应用监控 eBPF 版:实现高效协议解析的技术探索

使用 eBPF 来进行可观测性需要进行应用层协议解析,但云上微服务软件架构中的应用层协议往往比较复杂,这也给协议解析带来了不小的挑战。传统的协议解析方式存在 CPU、内存占用高,错误率高等问题,在应用监控 eBPF 版中,我们提出一种高效的协议解析方案,实现对应用层协议的…

七、TIM定时器

五、TIM定时器 TIM简介TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器组成时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获…

DHCP的安装与配置

虚拟机开启仅主机模式一:前期准备 1.打开windows虚拟机,使用仅主机模式 (虚拟机(M)→设置(S)→网络适配器)2.修改Windows ip可选范围为192.168.1.204到192.168.1.207 对应地址池IP为192.168.101--200二:安装DHCP 1.从开始打开服务器管理器,点击添加角色与功能2点下一步直到…

JVM内存模型及常用参数

JVM内存模型JVM内存参数设置Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里): java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar xxx.jar -Xss:每个线程的栈大小,默认1M -Xms:设置堆…

寄夜愚戏

\(\Huge{\textbf{「今日我们相聚于此」}}\) \(\Huge{\textbf{「是为了纪念我们的警钟」}}\) \(\Huge{\textbf{「她的牺牲对于整个蒟蒻而言」}}\) $\Huge{\textbf{ 「值得长达 \(\textbf{eps}\) 秒的摆烂缅怀」}}$AC900寄:一种基于否定的否定仍然是否定的模拟bool方式提交4k寄:…
推荐文章