数据绑定基本概述
什么是数据绑定
定义:在应用程序UI与业务逻辑之间建立连接的过程。
具体表现:
1. 当数据绑定正确,若数据源发生变化,则绑定的目标对象也将会发生更改。
2. 当数据绑定正确,若绑定目标对象发生变化,则数据源也将自动更新数据。
3. 如果不严格说可以将任意的.net对象绑定在一起。
数据绑定相关的基本概念
首先让我们来看MSDN上的理解,如图:
从上图我们可以看到一个完整的数据绑定的示意图,里面包括三个基本对象:绑定源、绑定目标、绑定方式,这三点是我自己总结的,我觉得这样概况比较好理解。
绑定源
1. 定义:
指提供数据的源对象,如果从数据绑定的定义上对应的话,一般是对应业务逻辑中提供的某个对象。
2. 绑定源类型:虽然这个东西不需要记忆,但是必须得了解
Ø 公共语言运行时(CLR)中对象:
Ø 动态对象:
Ø ADO.NET对象:如DataTable,DataSet等
Ø XML对象:如XMLNode、XMLDocument、XmlElement
Ø DependencyOject对象:即实现了DependencyOject的CLR对象或者自定义的都行
3. 具体绑定实例:
Ø 使用整个对象作为绑定源
即将整个对象作为绑定源,然后通过Source或者DataContext属性来指定绑定源,然后提供一个空白绑定声明:{Binding}
Ø 使用集合对象作为绑定源
通常都是用自定义的集合作为绑定源,如实现IEnumeratble接口的任何集合,且如果要实现动态绑定(插入或者删除自动更新),则必须实现INotifyCollectionChanged 接口,ObservableCollection<T> 类是公开 INotifyCollectionChanged 接口的数据集合的内置实现。
绑定目标
1. 定义:显示数据的对象,对应数据绑定的概念中一般是UI界面中的某个控件
2. 绑定目标对象的属性:
数据绑定一般是对绑定目标的某个属性值进行绑定,所以一定注意,绑定目标属性一定必须是依赖属性,而绑定目标却不限于自定义的CLR对象。
绑定模式
1. 定义:有了绑定源,绑定目标对象,就差两个事物之间关联,所以2个之间的绑定方式就是绑定模式,目前存在4中绑定模式。
2. 绑定模式:
l OneWay模式:
若绑定源数据的更改,会自动更新到绑定目标;但是若绑定目标的更改,则不会更新到绑定源。一般适用于绑定目标为隐式只读控件。
l TwoWay模式:
不管是绑定源还是绑定目标任何一方的数据更改,都会自动更新另一方。这种方式一般适用比较广泛,一般是可读写的控件。
l OneWayToSource模式:
刚好与OneWay模式相反,即绑定源的更改,不会通知绑定目标的更改;绑定目标的更改,会通知绑定源的更改。一般适用于从UI控件输入值。
l OneTime模式:
就一次性更改通知,即绑定源初始化一次更新到绑定目标,后续更改不会更新,这种模式一般不怎么常用,一般适用于静态数据的初始化,个人觉得这种时候用后台.CS代码实现会比较好。
数据绑定的使用细节注意
XMAL中数据绑定的声明
1. 绑定声明的格式:
{Binding 属性名称1=属性值1,属性名称2=属性值2,属性名称3=……}
外围一定要{},其次绑定类属性之间用,隔开
Eg:<TextBox Text=”{Binding Source={StaticResource MyData}, Path=”PersonName”}”
2. 绑定对象类的常用属性:
ElementName:获取或者设置要用作绑定源对象的元素名称
Mode:获取或者设置绑定模式
Path:获取或者设置绑定源属性的路径
RelativeSource:通过指定绑定源相对于绑定目标的位置,获取或者设置绑定源
Source:获取或者设置要用作绑定源的对象
TargetNullValue:获取或设置当绑定源的值为NULL时在绑定目标显示的值
StringFormat:获取或设置一个字符串,该字符串指定如果绑定值显示为字符串的格式
XPath:获取或设置一个XPath查询,查询返回要适用的XML绑定源值
3. 绑定对象类的附加事件:
SourceUpdated: 当值从绑定目标传输到绑定源时发生,但只针对 NotifyOnSourceUpdated 值设置为 true 的绑定
TargetUpdated: 当值从绑定源传输到绑定目标时发生,但只针对 NotifyOnTargetUpdated 值设置为 true 的绑定
Path属性指定绑定源值得路径语法
1. Path属性值要用到绑定源对象的某个属性值,格式:Path=绑定源对象.属性名,如:Path=PropertyName
2. Path指定绑定源对象的某个属性值的子属性,格式:Path=绑定源对象.属性名.子属性名如:Path=PropertyName.Width
3. Path指定绑定源的附加属性,格式:Path=(附加属性源.附加属性),如:Path=(DockPanel.Dock)
4. Path指定绑定源的索引值,格式:Path=属性名[索引号],如:Path=Shopping[0]
5. Path指定绑定源的值是属性和索引的混合使用,格式:Path=属性名.子属性[索引号],如:Path=Shopping.Order[0]
6. 在索引器内部,您可以有多个由逗号 (,) 分隔的索引器参数。 可以使用圆括号指定每个参数的类型。 例如,您可以有 Path="[(sys:Int32)42,(sys:Int32)24]"
7. Path指定集合视图,用斜杠指定当前项,格式:Path=/绑定项
8. Path指定到当前源,如:Text=”{Binding}” 等价Text=”{Binding path=.}”
数据绑定多种绑定类型
数据绑定的类型可谓变化多端,虽然下面描述的信息都是从MSDN上来的,但是MSDN上基本是从分主题进行阐述,笔者看完后虽然都会做了一遍,但是对于数据绑定还是迷迷糊糊的,感觉不到本质的东西,所以笔者进行了简单总结概括,方便理解和记忆。
首先我们从绑定的基本概念着手,数据绑定基本要素分为绑定源、绑定目标和绑定模式。因为绑定目标相对来说比较形象,所以我从绑定目标角度来分析,从WPF的构成来看,一个窗口类对象分为2个部分,分别是XAML语言构成.xaml文件和C#语言构成的.CS文件,简单说这就是微软的Codebehind技术吧,具体两者之间的详细区别我这里就不多说了,如果下面讲解会涉及到的我会提下。综上所述,我们可以这样分类数据绑定,绑定目标可以是.XAML文件的内容和.CS文件的内容,绑定源也可以是.XAML文件内容和.CS文件内容,经过交叉组合得到以下大类型:(绑定目标为.CS内容刚好是相反,并且可以通过绑定模式实现所以就不分析)
绑定目标对象为.XAML内容
尽然绑定目标为.xaml文件内容,就包括:.xaml中的各种控件,各种静态资源,所以绑定目标一般是控件的属性,或者是静态资源的属性值等。在这个条件下根据绑定源的不同,又可以分为2类:
绑定源为.xaml文件内容
1. 绑定目标为TextBlock(控件),绑定目标属性值为Text;定源为TextBox,绑定源属性值也为Text
在.xaml中看到绑定源的定义:
<TextBox Name="txtName" Grid.Row="0" Grid.Column="1"/>
<TextBox Name="txtAge" Grid.Row="1" Grid.Column="1"/>
在.xaml中看到绑定目标:
<!--txtbName最为绑定目标,绑定源是txtName-->
<TextBlock Name="txtbName" Text="{Binding ElementName=txtName, Path=Text}"/>
<!--txtbAge最为绑定目标,绑定源是txtAge-->
<TextBlock Name="txtbAge" Text="{Binding ElementName=txtAge, Path=Text}"/>
生成的效果就是在输入框中输入姓名跟年龄,在下面的显示信息中就会同步更新,达到绑定效果,如图:
2. 绑定目标为TextBlock(控件),绑定目标属性值为Text和TextBox,属性值也为Text;绑定源是window.Resources中的静态资源,静态资源包括:CLR定义对象,样式等
在.xaml中绑定源是一个字符串常量:引用命名空间
xmlns:sys1="clr-namespace:System;assembly=mscorlib"
<sys1:String x:Key="Name">sunjipeng</sys1:String>
在.xaml中绑定目标:
<!--txtbName最为绑定目标,绑定源是静态资源中的Name-->
<TextBlock Name="txtbName" Text="{StaticResource Name}"/>
效果如图:
![](https://i-blog.csdnimg.cn/blog_migrate/04477fe8a6446f20fdd8a7d9554cc233.png)
绑定源为.cs文件内容
1. 绑定目标为TextBlock(控件),绑定目标属性值为Text;绑定源为MyDataSource
自定义的类对象
在这种情况下又有两种实现方式,一种将自定义的类对象在.xaml中作为静态资源文件,然后再按照上面第二种情况去实现,这里就不累赘了。
还有一种是将自定义的类对象在后台.cs实例化后,赋值给绑定目标的数据上下文对象(DataContext):
.CS文件代码:
public BindingWindow()
{
InitializeComponent();
MyDataSource data = new MyDataSource();
txtbAge.DataContext = data;
}
.xaml文件中代码:
<TextBlock Name="txtbAge" Text="{Binding Path=Age}"/>
效果如图:
![](https://i-blog.csdnimg.cn/blog_migrate/0993b84b97184ca6cc0081f30483faf8.png)
注意:这种模式自定义类,如果是普通的类,则只能是数据源到绑定对象的更新通知,也就是说如果绑定目标更改,则不会自动更新到数据源。要想实现双向绑定,就必须让自定义类实现INotifyPropertyChanged更改通知机制,或者自定义依赖属性项
几种特殊的绑定类型
其实特殊绑定形式,也满足上面说的规律,只是针对个别特殊的绑定源对象的阐述,提醒。
1. 当你想将绑定源设置为CLR定义或自定义的枚举类型,并将枚举类型绑定到绑定目标
就如WPF中HorizontalAlignment枚举类型一样,值:left、center、Right、Stretch
这里我们直接在.XAML中资源中声明一个枚举类型,要用到OjectDataProvider类,用它通过反射机制反射出枚举类型的值,然后就绑定到绑定目标。
xmlns:sys1="clr-namespace:System;assembly=mscorlib"//命名空间
静态资源中绑定源定义:
<Window.Resources>
<sys1:String x:Key="Name">sunjipeng</sys1:String>
<ObjectDataProvider x:Key="HorizontalEnum" ObjectType="{x:Type sys1:Enum}" MethodName="GetNames">
<ObjectDataProvider.MethodParameters>
<x:TypeExtension TypeName="HorizontalAlignment"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
绑定目标中:
<ComboBox Name="comboxAlignment" Grid.Row="2" Grid.Column="1" ItemsSource="{Binding Source={StaticResource HorizontalEnum}}"/>
效果如图: