C# Note7:MVVM模式之数据绑定
2017-05-25 23:35
387 查看
一、资源说明
(1)本文参考自:
一步步走进WPF的MVVM模式(二):数据绑定
WPF之数据绑定总结
二、正文
数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM(WPF) 模式的一大支柱。
简而言之,数据绑定就是将两个属性绑定在一起,源属性(source)改变带动目标属性(target)一起改变。这样也减少了事件(Events)的使用。
绑定源可以是任意对象的属性,而目标必须是依赖对象的依赖属性。
绑定源主要分为以下几种场景(后面主要介绍前两种):
当我们拖动Slider的时候,
这在自定义控件中用的比较多。
上面的例子中都遵循着"数据源到目标"的 数据流方向 ,叫做"OneWay"的形式。WPF支持以下几种数据流方向:
那么何时触发绑定呢?WPF为我们提供了
我们也可以手动触发绑定:
当程序初始化的时候,某个人的年龄数值为10。一旦我点击了下面的Button,那么上面的数值会立刻变成30:
这里,我们没有在Button的
这个Person类实现了
当然,你也可以将
将需要被绑定的CLR对象实现
还有一种常见的情况:需要绑定一个集合对象,比如ListBox控件。这个时候,我们需要将这个集合对象继承自
数据绑定的核心就是上面介绍的,但是绑定的过程中肯定会遇到一些细节问题,幸好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
(1)本文参考自:
一步步走进WPF的MVVM模式(二):数据绑定
WPF之数据绑定总结
二、正文
数据绑定 (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为我们提供了很多机制,可以参考这些介绍做一个了解:
数据模板(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
相关文章推荐
- Windows Phone 7 MVVM模式数据绑定和传递参数
- 异步编程 - 针对异步 MVVM 应用程序的模式:数据绑定
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
- Silverlight之MVVM模式简单介绍项目(数据绑定)
- Angular双向数据绑定MVVM以及基本模式分析
- DataBinding 与 mvvm 模式(二)其他类型数据绑定
- Windows Phone 7 MVVM模式数据绑定和传递参数 from:http://www.cnblogs.com/linzheng/archive/2011/03/27/1997086.html
- RoboBinding:一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架
- WPF中使用MVVM模式进行简单的数据绑定
- Windows Phone 7 MVVM模式数据绑定和传递参数
- Windows Phone 7 MVVM模式数据绑定和传递参数
- MVVM模式和在WPF中的实现(二)数据绑定
- 第5篇 WPF C# 数据绑定Model-View-ViewModel模式
- MVVM模式的 数据绑定
- DataBinding 与 mvvm 模式(一)文本类型数据绑定
- 实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架——RoboBinding
- MVVM模式WPF的ComboBox数据绑定,使用Dictionary作为数据源
- MVVM模式中WPF数据的完全绑定
- Windows Phone 7中对于 MVVM模式的数据绑定和参数传递(转)
- Windows Phone 7 MVVM模式数据绑定和传递参数