通过Demo学WPF—数据绑定(一)✨

前言✨

想学习WPF,但是看视频教程觉得太耗时间,直接看文档又觉得似懂非懂,因此想通过看Demo代码+文档的方式进行学习。

准备✨

微软官方其实提供了WPF的一些Demo,地址为:microsoft/WPF-Samples: Repository for WPF related samples (github.com)

将其克隆到本地,有很多的Demo代码:

image-20240129141054183

新建一个空白解决方案:

image-20240129141201234

添加现有项目:

image-20240129141238024

选择Data Binding 中的 SimpleBinding:

image-20240129141537501

项目文件如下所示:

image-20240129141951318

查看SimpleBinding这个Demo的效果:

SimpleBindingDemo的效果

学习这个Demo✨

数据绑定的概念

首先需要知道数据绑定的基本概念,数据绑定是在应用 UI 与其显示的数据之间建立连接的过程。 如果绑定具有正确的设置,并且数据提供适当的通知,则在数据更改其值时,绑定到该数据的元素会自动反映更改。 数据绑定还意味着,如果元素中数据的外部表示形式发生更改,则基础数据可以自动进行更新以反映更改。 例如,如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改。

现在再来看一下,数据绑定的模型图:

image-20240129142805099

现在我们根据这张模型图,学习这个Demo。

这个模型图表示数据绑定至少需要三个东西:

  • 绑定目标
  • 绑定
  • 绑定源

现在我们分别看看这个demo里面,这三个东西在哪?

绑定目标

我们发现这个demo的绑定目标是元素TextBox的Text属性与TextBlock的Text属性。

绑定

image-20240129143549091

这是一个C#类,查找在该Demo中,哪里出现了Binding?

发现在MainWindow.xaml中出现了Binding,有两处地方,分别是:

  <TextBox><TextBox.Text><Binding Source="{StaticResource MyDataSource}" Path="PersonName"UpdateSourceTrigger="PropertyChanged"/></TextBox.Text></TextBox>

 <TextBlock Text="{Binding Source={StaticResource MyDataSource}, Path=PersonName}"/>

这两处都是在 XAML 中声明绑定。

 <TextBox><TextBox.Text><Binding Source="{StaticResource MyDataSource}" Path="PersonName"UpdateSourceTrigger="PropertyChanged"/></TextBox.Text></TextBox>

这种使用的是对象元素语法

<TextBlock Text="{Binding Source={StaticResource MyDataSource}, Path=PersonName}"/>

这种使用的是标记扩展

从这里我们接触到了Binding类的三个属性,SourcePathUpdateSourceTrigger

那它们分别是什么意思呢?

先来看下Source

image-20240129144554369

我们发现这个demo里,Source="{StaticResource MyDataSource}StaticResource MyDataSource又是什么呢?

在Window.Resources标签下有一行代码:

image-20240129144901173

<local:Person x:Key="MyDataSource" PersonName="Joe"/>

<Window.Resources>标签在XAML中用于定义可以在整个窗口中重用的资源。这些资源可以是各种类型,包括样式、数据源、数据模板、颜色、画刷等。

<local:Person x:Key="MyDataSource" PersonName="Joe"/>这行代码创建了一个Person对象,并将其命名为"MyDataSource",该对象的PersonName属性设置为"Joe",这样你就可以在窗口的其他地方通过这个键来引用这个对象。

因此Source={StaticResource MyDataSource}的意思就是将Binding对象的Source属性设置为键为"MyDataSource"的资源,在这里也就是一个Person对象。

再来看看Path

image-20240129150048051

表示绑定源属性的路径。

Path="PersonName"表示绑定源是刚刚那个Person对象的PersonName属性。

最后再看看UpdateSourceTrigger

image-20240129150426493

这个属性可能就会难理解一点。

它表示当绑定目标怎么样时,绑定源的值应该被更新。

它的类型为枚举类型,有以下几个值:

含义
Default绑定目标属性的默认 UpdateSourceTrigger 值。 大多数依赖属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。
Explicit仅在调用 UpdateSource() 方法时更新绑定源。
LostFocus每当绑定目标元素失去焦点时,都会更新绑定源。
PropertyChanged每当绑定目标属性发生更改时,都会更新绑定源。
 <Label>Enter a Name:</Label><TextBox><TextBox.Text><Binding Source="{StaticResource MyDataSource}" Path="PersonName"
UpdateSourceTrigger="PropertyChanged"/></TextBox.Text></TextBox>

我们会发现在这个demo中,TextBox.Text设置了UpdateSourceTrigger属性。

这是因为大多数依赖项属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。在这个demo中,我们不希望失去焦点才更新源数据,而是一发生改变就更新绑定源,因此设置UpdateSourceTrigger属性为PropertyChanged

总结一下,我们遇到的关于Binding类的三个属性SourcePathUpdateSourceTrigger

属性名含义
Source获取或设置要用作绑定源的对象。
Path获取或设置绑定源属性的路径。
UpdateSourceTrigger获取或设置一个值,它可确定绑定源更新的时机。

现在我们已经介绍了绑定目标、绑定就差绑定源了。

绑定源

在数据绑定中,绑定源对象是指用户从其获取数据的对象。

在这个demo中,绑定源是一个Person对象。

查看Person类的代码:

using System.ComponentModel;namespace SimpleBinding
{// This class implements INotifyPropertyChanged// to support one-way and two-way bindings// (such that the UI element updates when the source// has been changed dynamically)public class Person : INotifyPropertyChanged{private string _name;public Person(){}public Person(string value){_name = value;}public string PersonName{get { return _name; }set{_name = value;// Call OnPropertyChanged whenever the property is updatedOnPropertyChanged("PersonName");}}// Declare the eventpublic event PropertyChangedEventHandler PropertyChanged;// Create the OnPropertyChanged method to raise the eventprotected void OnPropertyChanged(string name){var handler = PropertyChanged;handler?.Invoke(this, new PropertyChangedEventArgs(name));}}
}

首先这个Person类实现了INotifyPropertyChanged接口,我们来看下INotifyPropertyChanged接口:

public interface INotifyPropertyChanged
{//// 摘要://     Occurs when a property value changes.event PropertyChangedEventHandler? PropertyChanged;
}

包含一个PropertyChanged事件,因此该Person类必须实现接口的成员PropertyChanged。

当属性值被设置时,会调用OnPropertyChanged方法,从而触发事件。

INotifyPropertyChanged接口定义了一个PropertyChanged事件,当一个属性的值发生变化时,你可以触发这个事件。WPF的数据绑定引擎会监听这个事件,当事件被触发时,它会更新绑定的UI元素的值。
如果你的数据源没有实现这个接口,那么当数据源的属性值发生变化时,WPF的数据绑定引擎将无法知道这个变化,因此它将无法更新UI元素的值。
这意味着,如果你的数据源的属性值在运行时可能会发生变化,并且你希望这些变化能够自动反映到UI上,那么你的数据源就需要实现INotifyPropertyChanged接口。

总结✨

通过这个小Demo,我们明白了WPF中的数据绑定的三要素,绑定对象、绑定、绑定源。在这个demo中,我们学会了如何在xaml中声明绑定,知道了Binding的三个属性SourcePathUpdateSourceTrigger的含义,明白了数据源为什么要实现INotifyPropertyChanged接口,学会了WPF中数据绑定的基本用法,希望对你有所帮助。

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

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

相关文章

day25 日期对象

日期对象 日期对象&#xff1a;用来表示时间的对象作用&#xff1a;可以得到当前系统时间 实例化 在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化创建一个时间对象并获取时间&#xff08;可以用于计算倒计时&#xff09; 获得当前时间const date new Date…

使用docker部署mongodb

1.创建目录 mkdir -p /opt/mongodb/{data,logs,config} 2.创建配置文件 进入目录 cd /opt写入配置 vim mongod.conf 内容如下 systemLog:# MongoDB发送所有日志输出的目标指定为文件destination: file# mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径path:…

QT 使用XML保存操作记录

文章目录 1 实现程序保存操作记录的思路2 XML文档基本结构3 QDomDocument实现XML读写3.1 QDomDocument实现生成XML文件3.2 QDomDocument实现读取XML文件 4 QXmlStreamWriter实现读写4.1 QXmlStreamWriter实现生成XML4.2 QXmlStreamWriter实现读取XML 1 实现程序保存操作记录的思…

【linux】-centos7版本前后-变化篇

1.centos7版本前后区别 首先文件系统变化&#xff0c;由EXT4&#xff0c;变为XFS格式。可支持容量500TB的文件&#xff0c;而6代仅能支持16TB。首个进程变为systemd, 替换了熟悉的init进程。它的特点是功能强大&#xff0c;体积也很强大。 systemd给我们带来了一个全家桶命令&…

【linux】磁盘空间不足-常用排查和处理命令

【linux】磁盘空间不足-常用排查和处理命令 1.通查一下 df -h #查看服务器磁盘空间情况 du -hs * 2>/dev/null #列出各目录所占空间大小 或 du -h -d 1 2>/dev/null #列出各目录所占空间大小 1.1情况一 df 磁盘空间和du 目录空间占用相等&#xff0c…

python17-Python的字符串格式化

Python提供了“%”对各种类型的数据进行格式化输出,例如如下代码。 # !/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2024/01# @Author : Laopiweight = 180print(老师傅的体重是 %s % weight) 上面程序就是格式化输出的关键代码,这行代码中的 print 函数包含三个部…

C# 二分搜索(Binary Search)

二分搜索概念 二分查找也称折半查找&#xff08;Binary Search&#xff09;它是一种效率较高的查找方法。但是&#xff0c;折半查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字有序排列。 二分搜索的背景 二分搜索法的概念和思想可以追溯到古代的中国和…

【python】求矩阵的特征值和特征向量

使用np.linalg.eig同时求特征值和特征向量 import numpy as np#输入矩阵 A np.array([[1, 1/2, 1/6, 1/9],[2, 1, 1/3, 1/5],[6, 3,1,1/2],[9, 5,2,1]])#求解特征值和其对应的特征向量 eigval,eigvec np.linalg.eig(A) for i in range(len(eigval)):print(f特征值&#xff1a…

STM32学习笔记一——初识STM32

目录 一、什么是ARM 二. Cortex 内核 三.什么是STM32 四.STM32核心板原理图&#xff1a; 五.STM32的内部结构&#xff1a; 六.stm32系统结构简化图 STM32基本原理分析&#xff1a; 七.典型型号——STM32F103ZET6 stm32——32位单片机&#xff08;数据总线是32位的&am…

mysql学习打卡day19

今日成果&#xff1a; update invoices set payment_total invoice_total *0.5,payment_date due_date where invoice_id 1; -- 更新单行记录 update orders set comments 金牌顾客 where customer_id in (select customer_id from customers where points > 3000); --…

文献速递:人工智能医学影像分割--- 深度学习分割骨盆骨骼:大规模CT数据集和基线模型

文献速递&#xff1a;人工智能医学影像分割— 深度学习分割骨盆骨骼&#xff1a;大规模CT数据集和基线模型 我们为大家带来人工智能技术在医学影像分割上的应用文献。 人工智能在医学影像分析中发挥着至关重要的作用&#xff0c;尤其体现在图像分割技术上。这项技术的目的是准…

如何将抖音API应用于抖音视频的录制和上传

抖音API允许开发者进行二次开发&#xff0c;使得第三方应用程序可以与抖音进行交互。要将抖音API应用于抖音视频的录制和上传&#xff0c;你需要遵循以下步骤&#xff1a; 获取抖音API密钥&#xff1a;首先&#xff0c;你需要从抖音官网注册一个开发者账号&#xff0c;并创建一…

Golang 流媒体服务器lalserver使用指南

目录 安装 使用 1.推流 2.播放 官方地址 安装 1.下载源码 wget https://github.com/q191201771/lal/releases/download/v0.36.7/lal_v0.36.7_linux.zipunzip lal_v0.36.7_linux.zip cd lal_v0.36.7_linux 2.启动 ./bin/lalserver -c ./conf/lalserver.conf.json 使用 …

TDengine 签约海博思创,助力储能运维平台数据管理

随着储能产业步入快速发展期&#xff0c;各类储能电站快速建设投产&#xff0c;规模各异&#xff0c;场景不同。为了实现储能电站的高效监控和运维管理&#xff0c;储能运维管理平台成为不可或缺的工具。通过高效的集中控制手段&#xff0c;这些平台能够有效解决储能电站运维成…

浅谈直流电表在韩国充电桩生产厂家的应用

I.背景&#xff1a; 近几年为应对温室气体的排放导致的全球变暖、气候变化等问题,各大国纷纷对焦推进电动汽车&#xff0c;从而减少传统燃油汽车带来的大量温室气体排放。而推进新能源汽车的各项举措之中&#xff0c;充电桩的基础建设&#xff0c;又是其中的重中之重&#xff…

AR眼镜_ar智能眼镜显示方案|光学方案

AR眼镜是一种智能眼镜&#xff0c;能够将虚拟现实和现实世界相结合&#xff0c;使人们能够在日常生活中体验和参与虚拟现实。然而&#xff0c;AR智能眼镜的制造成本高&#xff0c;开发周期长。要实现AR眼镜的各项功能&#xff0c;需要良好的硬件条件&#xff0c;而AR智能眼镜的…

python18-Python的字符串序列相关方法

字符串本质上就是由多个字符组成的,因此程序允许通过索引来操作字符,比如获取指定索引处的字符,获取指定字符在字符串中的位置等。 Python字符串直接在方括号([])中使用索引即可获取对应的字符,字符串中第一个字符的索引为0、第二个字符的索引为1,后面各字符依此类推。 …

数据库管理-第138期 数据库国产化是Office换WPS么(20240124)

数据库管理138期 2024-01-24 第138期 数据库国产化是Office换WPS么&#xff08;20240124&#xff09;1 背景2 现实3 方法论总结 第138期 数据库国产化是Office换WPS么&#xff08;20240124&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE…

ssl证书更换步骤及更换后有效期没有更新问题

因公司ssl证书到期&#xff0c;在阿里云申请免费证书更换后&#xff0c;查看证书有效期&#xff0c;发现有效期没有更新。 ssl证书更换步骤&#xff1a; 1.下载nginx证书文件 2.服务器上替换原有ssl证书&#xff08;操作前记得备份&#xff09; 3.更改nginx.conf文件中证书路径…

Python 一些常见的字符串操作

常见的字符串操作有&#xff1a; 创建字符串&#xff1a; # 使用单引号创建字符串 s1 Hello, World!# 使用双引号创建字符串 s2 "Python Programming"# 使用三引号创建多行字符串 s3 This is a multi-line string.访问字符串中的字符&#xff1a; s Hello, World…