一、资源说明

(1)本文参考自:

二、正文

 数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM(WPF) 模式的一大支柱。
 
简而言之,数据绑定就是将两个属性绑定在一起,源属性(source)改变带动目标属性(target)一起改变。这样也减少了事件(Events)的使用。
绑定源可以是任意对象的属性,而目标必须是依赖对象的依赖属性。
 
绑定源主要分为以下几种场景(后面主要介绍前两种):
(1)依赖对象(DependencyObject):可以绑定到任意依赖对象的依赖属性。
(2)CLR对象:可以绑定到任意CLR对象的公共属性、子属性以及索引器。绑定引擎使用CLR反射来获取属性值。
(3)动态对象:可以绑定到对象的可用属性和索引器,该对象实现 IDynamicMetaObjectProvider 接口。
(4)ADO.NET对象:可以绑定到ADO.NET对象,如 DataTable 。ADO.NET DataView 实现 IBindingList 接口,该接口提供绑定引擎侦听的更改通知。
(5)XML对象:可以绑定到并运行 XmlNode 、 XmlDocument 或 XmlElement 上的 XPath 查询。
  • 元素对元素的绑定

一种典型的场景是元素对元素的绑定(Element to Element binding),当一个元素属性发生改变,界面上另外绑定的元素属性也随之改变。

<stackpanel>
<textbox fontsize="{Binding ElementName=slider,Path=Value}" text="Welcome to WPF world." name="txt" />
<slider name="slider" maximum="26" minimum="14" />
<textblock text="{Binding ElementName=slider,Path=Value}" name="block" />
</stackpanel>

当我们拖动Slider的时候, TextBox 中字体的大小会随之改变,下方 TextBlock 中也会更新值。数据绑定利用XAML中 binding 关键字,设置它的 ElementName 和 Path 属性。也可以在代码中设置:

Binding bind = new Binding
{
Source = this.slider,
Path = new PropertyPath("Value")
}; BindingOperations.SetBinding(this.txt, TextBox.FontSizeProperty, bind);
BindingOperations.SetBinding(this.block, TextBlock.TextProperty, bind);

这在自定义控件中用的比较多。

上面的例子中都遵循着"数据源到目标"的 数据流方向 ,叫做"OneWay"的形式。WPF支持以下几种数据流方向:

(1)OneWay:绑定源更改时,更新绑定目标属性。
(2)TwoWay:导致对源属性或目标属性的更改可自动更新对方。
(3)OneTime:当应用程序启动或数据上下文更改时,更新绑定目标。比如用在命令(commands)上面。
(4)OneWayToSource:当目标属性更改时更新源属性。当目标属性不是依赖属性,而源属性是依赖属性的情况下,这就派上用场了。
(5)Default:使用绑定目标的默认Mode值。TextBox.Text属性默认是TwoWay绑定,而大部分情况下,比如TextBlock.Text属性就是OneWay绑定。

那么何时触发绑定呢?WPF为我们提供了 UpdateSourceTrigger属性,这是一个枚举值: LostFocus , PropertyChanged , Explicit , Default 。从字面意思也能知道何时触发。需要注意的是,这个属性只有当 Mode 被设置为 TwoWay 或者 OneWayToSource 的时候才能生效。

我们也可以手动触发绑定:

var expr = BindingOperations.GetBindingExpression(this.txt, TextBox.FontSizeProperty);
expr.UpdateSource();
//or
expr.UpdateTarget();
  • 绑定到CLR对象

这是最常用的一种情形了。

当程序初始化的时候,某个人的年龄数值为10。一旦我点击了下面的Button,那么上面的数值会立刻变成30:

这里,我们没有在Button的 Click 事件里直接改变中间TextBlock控件的 Text 属性,而是改变了这个 Person 对象的 Age 值,而最终的效果就是这个TextBlock控件的 Text 属性也跟着改变了。Data Binding机制在中间起到桥梁的作用。下面,我们来看看 Person 类的实现细节:

public class Person:INotifyPropertyChanged
{ public Person(int _age)
{
age = _age;
} private int age;
public int Age
{
get { return age; }
set
{
if (PropertyChanged != null)
{
//follow below order
age = value;
PropertyChanged(this, new PropertyChangedEventArgs("Age"));
}
}
} public event PropertyChangedEventHandler PropertyChanged;
}

这个Person类实现了 INotifyPropertyChanged接口(命名空间:System.ComponentModel),这个接口是WPF中数据绑定的核心接口。换言之,如若要想让CLR对象被成功绑定,那么这个接口就是必须的。这个接口只包括一个事件 PropertyChanged 。

Person 类内部包含一个属性 Age ,在其Setter中有一些逻辑,当然也是很容易懂的。如果这个属性被改变了,那么做一些更改,并向外部发出一些通知。

当然,你也可以将 Person 类继承 DependencyObject 类,让这个类变成依赖对象,里面的属性也就变成了依赖属性。但是,不建议这样做。

将需要被绑定的CLR对象实现 INotifyPropertyChanged 接口,这就是全部的准备工作了。

还有一种常见的情况:需要绑定一个集合对象,比如ListBox控件。这个时候,我们需要将这个集合对象继承自 ObservableCollection<T> 类即可,在后面MVVM框架的内容中会对此有进一步的理解。

数据绑定的核心就是上面介绍的,但是绑定的过程中肯定会遇到一些细节问题,幸好WPF为我们提供了很多机制,可以参考这些介绍做一个了解:

C# Note7:MVVM模式之数据绑定的更多相关文章

  1. MVVM模式的 数据绑定

    数据绑定要达到的效果 数据绑定要达到什么效果呢,就是在界面中绑定了数据源之后,数据在界面上的修改能反映到绑定源,同时绑定源的修改也能反映到界面上.从界面反映到绑定的数据源是很容易理解的,因为在绑定过程 ...

  2. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  3. WPF中使用MVVM模式进行简单的数据绑定

    计划慢慢整理自己在WPF学习和工作应用中的一些心得和想法,先从一个简单的用法说起 在WPF中,XAML标记语言中绑定数据,而数据源就是指定为ViewModel类,而非界面本身的逻辑代码类 这样一定程度 ...

  4. Android进阶笔记13:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)

    1.RoboBinding RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.从简单的角度看,他移除了如addXXListen ...

  5. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  6. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  7. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  8. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  9. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

随机推荐

  1. Pandas 拼接操作 数据处理

    数据分析 生成器 迭代器 装饰器 (两层传参) 单例模式() ios七层 io多路 数据分析:是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律 pandas的拼接操作 p ...

  2. Django-rest-framework 接口实现 rest_framework 中有已经定义好的 工具类 mixins generics viewsets

    rest_framework.mixins 请求业务 的 5 种实现 ​ mixin(混合类):不能单独使用,和其它类搭配起来使用(利用了Python支持多继承) rest_framework.mix ...

  3. php面试题整理(五)

    表单也得改

  4. IOT,笔记:avrdude: ser_open(): can't open device "\\.\COM3": 系统找不到指定的文件。

    1.下载驱动:https://www.arduino.cc/ 下载后解压 2.UNO板子以及驱动的相关设置 将UNO板子用数据线连接到电脑上,设置驱动: 打开设备管理器----->找到端口--- ...

  5. [JXOI2018]排序问题

    嘟嘟嘟 这是今天做的第二道九条可怜的题,现在对他的题的印象是:表面清真可做,实则毒瘤坑人. 首先要感谢吉司机,我期望学的特烂,好在样例直接告诉我们期望怎么求了. 令\(b_i\)表示第\(i\)个不同 ...

  6. 第8章 java中的并发工具类

    8.1 等待线程完成的CountDownLatch 作用:让一个线程等待其余线程完成之后在继续执行,如主线程等待开启服务的子线程执行完毕后主线程继续执行,类似于join.

  7. 【vue】vue +element 搭建项目,在使用InputNumber 计数器时遇到的问题

    自己遇到的坑: InputNumber 计数器的change事件定义时如果不传入参数value,会产生this.num不同步的问题 <template> <el-input-numb ...

  8. Debian系统下实现通过wpa_config连接WPA-PSK加密的Wifi连接

    Debian系统下实现通过wpa_config连接WPA-PSK加密的Wifi连接 文章参考:BASST | BLOG : Setting up Wifi - Debian Wheezy 预环境 De ...

  9. git分支开发的好处

    有不少开发者们不习惯使用Git分支开发.原因有如下几个方面?(1)不熟悉不习惯;(2)觉得太麻烦;今天我想说的是使用git分支开发绝对是一个高效版本控制的做法. 当你遇到测试人员给你提的bug,你只需 ...

  10. Vue.js项目详解

    还是以Blog项目来讲解,最近我本人利用闲暇时间,以博客作为参考学习一些新的技术并尝试之前没有尝试过的思路来玩玩. 技术看似枯燥,但是带有一个目的来学,你会发现还是蛮有趣的. 主要实践的就是前后端分离 ...