Binding(一):数据绑定
这节开始分几期来讲一下WPF中Binding的相关用法,本节主要讲使用Binding进行数据绑定。
Binding的作用
在WinForm中,我们要想对控件赋值,需要在后台代码中拿到控件对象进行操作,这种赋值形式,从根本上是无法实现界面与逻辑分离的。在WPF中,微软引入了Binding对象,通过Binding,我们可以直接将控件与数据做绑定,在后台不用拿到控件对象,直接操作数据源,系统会自动监听数据源的变化实时的更新到控件上,相反的,用户改变控件的值,也会实时更新到后台数据源,这也就是我们之前所说的,WPF天生支持MVVM模式。
数据绑定
下面将通过一个实例来讲解如何使用Binding进行数据绑定,具体内容如下:

点击按钮“展示数据”时,将数据显示在上方文本框中。
后台代码如下:

我使用GetData方法模拟数据,返回1-10的随机数,上图所示的形式是使用控件对象直接赋值的方式。
另外,您可能已经注意到了,我实现了一个System.ComponentModel命名空间下的INotifyPropertyChanged接口,这个接口是实现数据绑定后台必须要继承的接口,从它的字面意思我们也可以知道这个接口是用于通知属性已经改变,这个接口内部有一个PropertyChanged的事件,我们需要在每个要绑定的属性的set中调用它,就如上图Data属性中:
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Data"));
这句代码,它的意思就是通知系统,我的Data属性改变了,系统收到这个通知,会及时找到跟这个属性Binding的前台控件及时的更新值,下面演示使用Binding进行数据绑定:
publicMainWindowBase()
{
InitializeComponent();
Binding binding = new Binding();
binding.Source = this;
binding.Path = new PropertyPath("Data");
BindingOperations.SetBinding(this.text_show, TextBox.TextProperty, binding);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Data = GetData();
}
我们需要在构造器中先设置绑定,新建Binding对象,设置它的源和路径,意思就是去哪个地方找哪个属性,最后通过BindingOperations.SetBinding这个方法将绑定设置到控件,这样我在Button的事件处理器中只管对Data赋值,系统会自动更新到控件,这也是WPF中的数据驱动控件。
另外,Binding对象还有个Mode属性,它是BindingMode枚举,枚举内容如下图:

OneWay:指示数据只从源到控件,用户手动改变控件的值,系统不会更新到源,它跟OneWayToSource是相反的,后者是数据只从控件到源;
TwoWay:则是数据可以在控件和源双方流通;
Default:默认值,一般是TwoWay;
OneTime:顾名思义,数据只会流通一次;
SetBinding方法中有三个参数,第一个和最后一个参数是要绑定的控件对象和Bingding对象,第二个参数是控件对象的依赖属性,指示绑定的数据要赋值给控件的哪个属性,此处要说明一下,只有控件的依赖属性才可以使用数据绑定,关于依赖属性,会在后续的章节解释。
运行起来,点击按钮后,效果如下:

在实际开发中,我们一般会将绑定的这块代码写在通过XAML标记扩展的形式写在Xaml页面中,那么构造器中关于绑定的代码就可以删掉,改为如下代码:
public MainWindowBase()
{
InitializeComponent();
this.DataContext = this;
//Binding binding = new Binding();
//binding.Source = this;
//binding.Path = new PropertyPath("Data");
//BindingOperations.SetBinding(this.text_show, TextBox.TextProperty, binding);
}
<TextBox x:Name="text_show" Text="{Binding Path=Data}" />
在前台使用标记扩展绑定数据,需要后台配置前台的数据上下文,就是this.DataContext对象。
标记扩展中,使用Binding命令指示数据绑定,Path属性是默认值,可以省略,Source也可以省略,默认DataContext对象,这样就极大的简化了代码。
总结起来,使用Binding的流程是:
1.实现INotifyPropertyChanged接口
2.为需要绑定的属性的set块添加PropertyChanged事件通知
3.在构造器(不一定是构造器,可以是任何一个早于您使用数据绑定情景之前的方法中)中绑定数据源 或者 使用XAMl的标记扩展绑定数据源

Binding(一):数据绑定的更多相关文章
- Android Data Binding(数据绑定)用户指南
Android Data Binding(数据绑定)用户指南 http://www.jianshu.com/p/b1df61a4df77 https://github.com/LyndonChin/M ...
- Data Binding MVVM 数据绑定 总结
示例代码:https://github.com/baiqiantao/DataBindingTest 参考:精通Android Data Binding Android Data Binding ...
- Data Binding(数据绑定)用户指南
1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件. Data Binding库不仅灵活而且广泛兼容- 它 ...
- 121、Data Binding(数据绑定)(转载)
http://www.jianshu.com/p/b1df61a4df77 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/060 ...
- WPF Binding学习(二)
Binding作为数据的桥梁,连通业务逻辑层的对象(源对象)和UI的控件对象(目标对象).在这座桥梁上,我们不仅可以控制在源对象与目标对象是双向通行还是单向通行.还可以控制数据的放行时机,甚至可以在这 ...
- Android开发教程 - 使用Data Binding(一) 介绍
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...
- 精通 Android Data Binding
转自:https://github.com/LyndonChin/MasteringAndroidDataBinding 官方虽然已经给出了教程 - Data Binding Guide (中文版 - ...
- 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释
目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...
- Programming Entity Framework 翻译(1)-目录
1. Introducing the ADO.NET Entity Framework ado.net entity framework 介绍 1 The Entity Relationship Mo ...
随机推荐
- SpringBoot项目启动后自动打开浏览器
编写一个类,注册为Spring的Bean,然后实现CommandLineRunner接口,重写run()方法即可 @Component public class OpenBrowser impleme ...
- Gentoo 后的几个细节的完善
Gentoo 后的几个细节的完善 目录 Gentoo 后的几个细节的完善 细节一:引导分区与 cdrom 开机正确挂载 细节二:可预见的命名规则的网络接口名称改为传统的 eth0 细节三:为管理员用户 ...
- docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群
题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...
- Fiddler抓包工具使用记录
前言 Fiddler是一款强大的Web调试代理工具,又称抓包软件,本文记录如何使用Flidder进行抓包 Fiddler官网:https://www.telerik.com/fiddler 下载安装 ...
- 24.Collection集合
1.Collection集合 1.1数组和集合的区别[理解] 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用 ...
- traefik ingress Controller使用
Kubernetes Ingress Kubernetes Ingress是路由规则的集合,这些规则控制外部用户如何访问Kubernetes集群中运行的服务. 在Kubernetes中,有三种方式可以 ...
- 【海通国际】Joe Lowry(Mr. Lithium)谈全球电池原材料供应危机
[海通国际]Joe Lowry(Mr. Lithium)谈全球电池原材料供应危机 环球锂业公司(Global Lithium)总裁Joe Lowry日前接受了欧洲锰业Euro Manganese的邀请 ...
- RHEL_高级磁盘管理(vdo、stratis)
RHEL高级磁盘管理-VDO VDO简介 Virtual Data Optimizer 通过数据去重.压缩的方式来优化存储空间. VDO层放置在现有块存储设备上,例如Raid设备.本地磁盘设备. LV ...
- [Linux-网络性能测试] -- netperf测试
[Linux-网络性能测试] -- netperf测试 2017.01.17 14:15:54字数 1599阅读 4400 简述 Netperf是一种网络性能的测量工具(由惠普公司开发的,测试网络栈. ...
- 什么是环境变量,Linux环境变量及作用 echo
什么是环境变量,Linux环境变量及作用 < Linux命令的执行过程是怎样的?(新手必读)Linux PATH环境变量是什么,有什么用?(入门必读) > <Linux就该这么学&g ...