WPF 的内部世界(Binding)
目录
前言
“一桥飞架南北, 天堑变通途”
写于1956年,1957年武汉长江大桥建成, 称之为:一桥飞架南北,大堑变通途.它形象地描述武汉长江大桥的雄伟气势及其在我国南北交通方面发挥的重要作用。
哈哈,为什么要说这么一句无头理的话呢?
Binding一词,第一反应给我们以“绑定”的涵义。错了错了~~
Binding就好像一个“桥梁”
额……对没错,就是桥梁,Bind 一词在做动词时,实际上具有关联的含义。
也就是说Binding更注重表达它是一种像桥梁一样的关联关系
我们通过Binding完成UI层与逻辑层的数据交互, 当逻辑层的属性发生变动时,会通知Binding,当Binding知道是哪个属性变动后,通知给UI端相关联的控件,完成相应动作。
属性是怎么发出通知的?
属性
快捷键“propf”
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
属性是没有办法发出通知的,比如我我把值改为了3,它是不会去通知别人说:“看!我变成小3了!!”。
它要是会通知的话,那真是“见鬼了!”。
让属性说话的魔法(INotifyPropertyChanged)
我们是伟大的程序猿,想让属性说话还不简单,我们有魔法!
INotifyPropertyChanged 接口
译为“属性变化时通告”
我们创建一个Student类实现这个接口。
发现它实现了一个事件“PropertyChanged”。
“说话的能力”PropertyChanged
接口默认实现了一个事件,
这个事件怎么用呢?在哪里执行呢?
- 我们知道是当“属性的值发生改变时去通知”。
- 在属性里赋值为set方法 ,所以我们的事件在set方法体里实行。
我这里用了事件执行的一个语法糖,意思是 “不为空时就执行事件(?.Invoke())”。
当是,你可能更常见的是这种
PropertyChanged的参数
第一个参数也就是触发这个事件的对象(this),第二个参数实际上告诉是哪个属性发生了变化(new PropertyChangedEventArgs(propName)),所以是个字符串,表示当前属性的名称。
好吧!!属性有了能力呢,那么是怎么Binding(关联)的呢?
C#里的Binding
一、首先,我们在页面放置一个文本框和一个按钮,要实现点击按钮时:文本框的内容随着Binding的属性的值改变而发生改变。
给文本的Name赋值为“txt1”,给按钮添加一个点击事件(先像winform那样,找到控件的属性-》事件里去添加)
二、在窗体的后台代码里,初始化,绑定Binding
没错,我们并没有去操作什么,只是让学生的姓名变化,文本框就自动变化了,这就是Binding。
在这里我们衍生出几个知识点:
“问渠哪得清如许,为有源头活水来”
设问:这“半亩方塘”为什么这么清澈呢?并自答:因为有这源头活水不断地补充进来,才使得它这么清澈。——朱熹的《观书有感》
就好像我们的程序为什么这么有活力呢,正是因为有好的源头(水源),还有路径(水流的道路)。
1、Source(数据源)
Binding对数据源的要求并不是那么苛刻,只要它是一个对象,并且通过属性公开自己的数据(set;get;),它就能作为Binding的源。
就好像我们把Student的当作数据源,Student的通过公开属性(Name)让我们拿到信息。
2、Path(路径)
数据公开了,我们怎么拿到呢?
我们需要通往它的道路(Path),Binding的Path是一个PropertyPath类型,参数是一个string。也就是属性的名称(Name)。
我们把属性的名称来当作访问的路径。
3、Binding 怎么和控件关联
我们已经实例化好了一个Binding,并且设置了Source和Path。现在,我们需要将它与文本框关联。
BindingExpressionBase.SetBinding(DependencyObject target, DependencyProperty dp, BindingBase binding)
参数:
- target:绑定的绑定目标。
- dp:绑定的目标属性。
- binding: 描述绑定的 System.Windows.Data.BindingBase 对象。
三、Binding的简写方法
1、this.name.SetBinding()
2、new Binding(){}
xaml里的Binding
一、构造函数改变一下
我们这里使用文本框的DataContext赋值数据源,而不是用Binding的Source.
因为在xaml代码里去binding一个Source是很麻烦的事情。而且,一般只有静态资源,或者是以控件的数值为数据源时,我们才在xaml代码里去BindingSource(这个轮到后面展示)
DataContext数据上下文
- 当一个Binding没有Source时,会发生什么了?它会把当前对象的DataContext作为数据源。
- DataContext属性定义在FrameworkElement类里,这个类是WPF控件的基类,这就意味着,所有控件都有这个属性。
- 如果当前对像的DataContext为空,它就会像它的父容器”借“一下。
所以也可以写成这样
二、编写xaml代码
三、XAML中Binding写法的解释
- Text=“{Binding Path=Name }”
- 解读:并不是为Text赋了一个Binding的值。
- 应该是为TextBox的属性Text关联(Binding)了一个数据源,可以把这看成一个 Binding的构造函数,相当于初始化Binding
还记得一开始的写法嘛
Binding静态资源和控件
1、关联静态资源
Resource
每个控件都有一个 Resource属性,我们可以在里面存放资源,方便访问。
在这里我们实例化了一个Student,并且设定了一个key=“student”。
Source={StaticResource student}
通过StaticResource访问静态资源,通过key来确定关联哪个数据源。
2、关联控件
我们来实现一个效果,当滑动进度条时,文本显示滑动的值,文本框输入值,进度条滑动到合适的位置。
(方法一)放置俩个控件,在C#里关联控件
我们会发现只有当文本框的值失去焦点时,进度条的显示才会变化。我们来设置一下: UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged(当值发生变化时就触发)
(方法二)放置俩个控件,在xaml里关联控件
就是这么简单,我们这里使用的时elementname来绑定是哪个控件,你看Binding的样式,是不是特别像构造函数初始化
BindingPath的“/”用法
当我们数据源的一个属性是一个集合时,我们需要集合里的子元素。怎么去Path指定呢?
我们在创建一个班级类,班级类有一个Name属性,还有一个Student集合,代表有多个学生。
如果数据源的属性是一个集合,要把集合中的子元素当作Path,使用多斜线的语法,一路“斜下去”。
结尾
呼,Binding的用法实在太多了,剩下的数据校验和数据转换,下期在做,当然我总结的可能很懒散,但是我是尽量再用白话文来解释。一定要多动手尝试,你就会发现Binding的乐趣所在。
“你不能拥有的,别人替你去拥有”
WPF 的内部世界(Binding)的更多相关文章
- WPF 的内部世界(控件与布局)
目录 一.控件与布局 前言 为什么要写WPF呢? 我一开始算是比较抵触WPF的,因为用的人少吗.感觉都是窗体应用能和Winform有什么区别.可是我错了,非常感谢我的讲师,给我推荐刘铁猛的<深入 ...
- WCF/WPF公司内部订餐程序开发
WCF/WPF公司内部订餐程序开发 (服务端篇) 上班的第一天,群里讨论关于订餐的问题,所以想到了要不要自己开发一个公司内部的订餐系统呢?方便公司内部员工的订餐,有了想法就简单的实践了下 . 实现还是 ...
- [WPF]如何调试Data Binding
前言 在WPF开发中,将ViewModel中对象绑定到UI上时,会出现明明已经将数据对象Binding到UI,但是UI上就是不显示等等的问题.这篇博客将介绍WPF Data Binding相关的内容, ...
- [一起读源码]走进C#并发队列ConcurrentQueue的内部世界 — .NET Core篇
在上一篇<走进C#并发队列ConcurrentQueue的内部世界>中解析了Framework下的ConcurrentQueue实现原理,经过抛砖引玉,得到了一众大佬的指点,找到了.NET ...
- WPF Custom Command And Binding
using System; using System.Collections.Generic; using System.Windows.Input; namespace WPF.Commands { ...
- WPF DataGrid标题Header Binding失效
前言:因业务需要对WPF中的DataGrid控件中的行数进行统计,同时把统计的行数显示在列标题上. 如果我们用常规的Binding手段更新DataGridTextColunm的Header的话是不会生 ...
- WPF之数据绑定Data Binding
一般情况下,应用程序会有三层结构:数据存储层,数据处理层(业务逻辑层),数据展示层(UI界面). WPF是“数据驱动UI”. Binding实现(通过纯C#代码) Binding分为source和ta ...
- WPF中的Data Binding调试指南
大家平时做WPF开发,相信用Visual studio的小伙伴比较多.XAML里面曾经在某些特殊版本的Visual Studio中是可以加断点进行调试的,不过目前多数版本都不支持在XAML加断点来调试 ...
- WPF在XAML中Binding使用StringFormat属性
1. 绑定Currency, 如果没有字符的话, =后面需要先加入{}. 不加的话会出问题. 1 <TextBlock Text="{Binding Amount, StringFor ...
随机推荐
- 【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
问题描述 在PHP项目部署在App Service后,上传文件如果大于1MB就会遇见 413 Request Entity Too Large 的问题. 问题解决 目前这个问题,首先需要分析应用所在的 ...
- java字符串类型数学运算表达式以及精度丢失问题
字符串类型数学运算精度丢失问题 方式一:ScriptEngine 会精度丢失,可执行连续双括号 方式二:hutool ScriptUtil 会精度丢失,可执行连续双括号 方式三:hutool Scri ...
- 7 行代码搞崩溃 B 站,原因令人唏嘘!
前不久,哔哩哔哩(一般常称为 B 站)发布了一篇文章<2021.07.13 我们是这样崩的>,详细回顾了他们在 2021.07.13 晚上全站崩溃约 3 小时的至暗时刻,以及万分紧张的故障 ...
- for(int i=0;i<1000;i++)与 for(int i=1;i<=1000;i++)。 if ( i%500){}//前者表示0-501一个循环,后者1-500一个循环
`package com.Itbz; import java.sql.Connection; import java.sql.PreparedStatement; /** 向mysql数据库批量添加数 ...
- 在centos7.6上部署前后端分离项目Nginx反向代理vue.js2.6+Tornado5.1.1,使用supervisor统一管理服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_102 这一次使用vue.js+tornado的组合来部署前后端分离的web项目,vue.js不用说了,前端当红炸子鸡,泛用性非常广 ...
- Quicker程序实用及获取
-- 仅代表个人见解 --官方网站:https://getquicker.net/主界面截图 桌面图标截图 3分钟快速体验Quicker https://getquicker.net/KC/ ...
- Thinhole类声明和实现
Thinhole类说白了就是在眼睛处,放一个放大镜.就像我们平时用放大镜观察物体一样.这样实现的效果的是,周围会模糊.原理书上都说的很清楚了,我把算法截图下来了.这个应用我猜测是在竞技游戏比如csgo ...
- 正则表达式实战:最新豆瓣top250爬虫超详细教程
检查网页源代码 首先让我们来检查豆瓣top250的源代码,一切网页爬虫都需要从这里开始.F12打开开发者模式,在元素(element)页面通过Ctrl+F直接搜索你想要爬取的内容,然后就可以开始编写正 ...
- pnpm 的 workspace 实现 monorepo 工程
前言 前端多个包管理的的方式一般都是采用monorepo的方式去管理,之前都是使用的lerna的workspace去管理.这段时间包管理切换到了pnpm上,它也有worksapce,可以支持monor ...
- k8s vs k3s: 差异解析
Kubernetes无疑是容器编排领域的领头羊.但目前,我们看到K3s或轻量级的Kubernetes发行版,轻巧.高效.快速,占用空间极小.鉴于目前企业对于在生产环境中使用K3s还是K8s感到纠结.我 ...