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(一):数据绑定相关推荐
- Data Binding Library数据绑定框架
Data Binding Library是Google在2015年IO大会上发布的一个用于实现MVVM设计模式的支持库 环境配置 在Android Studio 2.0 原生支持Data Bindin ...
- WP7之题样式与数据绑定
Windows Phone 主题 1. 用户可以客户化主题 用户可以自己选择明亮或灰暗的背景: Windows Phone系统本身提供了10种主题颜色(accent colors)可供选择: 2. S ...
- .Net Framework 3.0 概述
Microsoft .NET Framework 3.0, the managed programming model for Microsoft® Windows®, includes the .N ...
- Vue开发入门看这篇文章就够了
摘要: 很多值得了解的细节. 原文:Vue开发看这篇文章就够了 作者:Random Fundebug经授权转载,版权归原作者所有. 介绍 Vue 中文网 Vue github Vue.js 是一套构建 ...
- 理解 angular2 基础概念和结构 ----angular2系列(二)
前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...
- Android 开发工程师面试指南
原文链接:https://github.com/GeniusVJR/LearningNotes <Android 开发工程师面试指南 LearningNotes >,作者是知乎Androi ...
- Vue -渐进式JavaScript框架
介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的区别? Library 库,本质上是一些函 ...
- macOS NSTableView
英文原文地址 趁着项目不紧张,赶紧武装一下自己,如果有一天移动开发混不下去了,还可以转转macOS开发(虽然它和iOS开发的区别很小),如果你是一名iOS的开发者,那么其实你已经掌握了很大一部分mac ...
- Android Studio 2.3 Canary 3 版本发布
开发团队12月13日发文宣布 Android Studio 2.3 Canary 3 版本已发布至 Canary 和 Dev 渠道. 除了常见的大量 bug 修复,在这个版本中还有一些值得注意的变化: ...
最新文章
- windows msys编译64位x264和ffmpeg
- day4 流程控制while 判断if
- mysql relaylog 慢_MySQL 主从同步延迟的原因及解决办法
- 软件开发工具(第2章:软件开发过程及其组织)
- wp博客链接.html,WordPress博客文章标题链接到自定义网址链接
- android模拟器 dx,dx欧布奥特曼变身模拟器
- 软件开发工作者的重心是什么
- 9个优秀的标签云免费生成工具
- 互联网思维之简约思维
- pareto解是什么意思_Pareto是什么意思_Pareto的翻译_音标_读音_用法_例句_爱词霸在线词典...
- php融云开发文档,融云应用公众服务开发者文档 - 融云 RongCloud
- deepin20.3 的问题
- Android背景设置透明和半透明效果
- 解决vue项目路由出现message: “Navigating to current location (XXX) is not allowed“的问题
- 2010年5月24日--2015年5月24日
- 【软件测试】盘一盘工作中遇到的 MQ 异常测试
- 三星集团继承人李在镕将接受韩国检方质询
- office修复找不到msi_Microsoft Office安装程序找不到ProPlus.WW\ProPlusWW.msi 弄不了
- [ROC-RK3399-PC Pro] 手把手教你移植主线U-Boot(基于v2022.04-rc5版本)
- TOM-610重锤式电阻测试仪-表面电阻测试利器
热门文章
- 使silverlight适应IE窗口大小的方法
- 华为首款鸿蒙设备正式入网,华为首款鸿蒙设备正式入网:麒麟9000+挖孔全面屏,价格感人!...
- js split参数为无效字符_js使用split函数按照多个字符对字符串进行分割的方法
- 洛谷P1019 单词接龙
- nginx限流健康检查
- 通过api管理grafana
- c#调用存储过程查询表并返回影响的行数
- 斯坦福大学Andrew Ng - 机器学习笔记(8) -- 推荐系统 大规模机器学习 图片文字识别...
- C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
- SQL对Xml字段的操作