C# Note7:MVVM模式之数据绑定
一、资源说明
(1)本文参考自:
二、正文
(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为我们提供了很多机制,可以参考这些介绍做一个了解:
- 数据模板(data template): http://wpftutorial.net/DataTemplates.html
- 值转换器(value converters): http://wpftutorial.net/ValueConverters.html
- 绑定到多个属性(bind to multiple properties): http://tech.pro/tutorial/809/wpf-tutorial-using-multibindings
- 验证数据(validating data): http://wpftutorial.net/DataValidation.html
C# Note7:MVVM模式之数据绑定的更多相关文章
- MVVM模式的 数据绑定
数据绑定要达到的效果 数据绑定要达到什么效果呢,就是在界面中绑定了数据源之后,数据在界面上的修改能反映到绑定源,同时绑定源的修改也能反映到界面上.从界面反映到绑定的数据源是很容易理解的,因为在绑定过程 ...
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- WPF中使用MVVM模式进行简单的数据绑定
计划慢慢整理自己在WPF学习和工作应用中的一些心得和想法,先从一个简单的用法说起 在WPF中,XAML标记语言中绑定数据,而数据源就是指定为ViewModel类,而非界面本身的逻辑代码类 这样一定程度 ...
- Android进阶笔记13:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)
1.RoboBinding RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.从简单的角度看,他移除了如addXXListen ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信
MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- [转载]MVVM模式原理分析及实践
没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...
随机推荐
- Grid布局指南
简介 CSS网格布局(又称“网格”),是一种二维网格布局系统.CSS在处理网页布局方面一直做的不是很好.一开始我们用的是table(表格)布局,然后用float(浮动),position(定位)和in ...
- 输出 1-100 内的奇数和偶数,并对其分别求和(while嵌套if-else循环)
package com.summer.cn; /** * @author Summer * 输出 1-100 内的奇数和偶数,并对其分别求和 * while嵌套if-else循环 */ public ...
- redis学习(二)——String数据类型
一.概述 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的 ...
- Java中的hashCode() 和 equals()的若干问题解答
一.hashCode()的作用 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int ...
- 环境部署(四):Linux下查看JDK安装路径
在安装好Git.JDK和jenkins之后,就需要在jenkins中进行对应的设置,比如在全局工具配置模块,需要写入JDK的安装路径. 这篇博客,介绍几种常见的在Linux中查看JDK路径的方法... ...
- kafka+storm结合存在的一些问题与解决方法
在配置kafka和storm的时候, 经常的会出现一些问题, 主要在以下几个: 1. 打jar包上去storm集群的时候会出现jar包冲突,类似于log4j或者sf4j的报错信息. 2. kafka ...
- vue引入css的两种方式
方案1.在main.js中引入方式 import '@/assets/css/reset.css' 方案2.在.vue文件的<style/>标签里面引入 @import &qu ...
- DOM(二)
文档信息 document对象还有一些标准的Document对象所没有的属性: title属性:包含着<title>元素中的文本——显示在浏览器窗口的标题栏或标签页上,通过整个属性可以取得 ...
- form,ajax注册,logging日志使用
一.form表单类型提交注册信息 二.ajax版本提交注册信息 <!DOCTYPE html> <html lang="en"> <head> ...
- Python学习第二篇
list_num=list(range(1,1000001)) print(min(list_num)) print(max(list_num)) print(sum(list_num)) print ...