Binding是用来实现界面控件的属性与后台数据之间的绑定,通过这种形式将前台界面与后台数据联系在一起达到界面与数据耦合的目的。
WPF绑定引擎从 Binding 对象获取有关以下内容的信息: 源对象和目标对象,数据流的方向,通过binding的模式来确定数据绑定的方向,一共有五种模式(Default,OneTime,OneWay,OneWayToSource,TwoWay),值转换器通过将 Converter 属性设置数据转换成所指定的值,每个Binding对象都有一个ValidationRules属性,可以被设置为一个或多个派生自ValidationRule的对象,每个规则都会检查特定的条件并更具结果来标记数据的有效性。
总得来说,可以分为一下几种: 对象间的绑定· 绑定到集合· 数据模板,多值绑定。
直接绑定某个key
在xaml中,某些key被写成一个资源,例如字符串,数值类型,那么其本身就是一个数据,这时候可以直接绑定key,那么此时这个path就可以直接写成一个点(.),另外此时这个path也可以省略不写,直接绑定source。
数据源是控件的依赖属性
这个是在项目上使用特别多的一种绑定源,依赖属性不仅是可以是一个目标也可以是一个数据源,直接绑定其他控件的依赖属性,此时通过绑定控件的名字以及绑定的路径和绑定模式,一般是默认,默认模式不是每个控件都是一样的,这个模式就决定了数据的流向。
使用RelativeSource绑定
当我们控件不能够通过名字找到源的时候可以通过RelativeSource去找到控件,通过相对的位置去找寻源,RelativeSource模式有三种,TemplatedParent、Self和FindAncestor。
第一种是通过自身:
通过TemplatedParent找寻父控件作为自身的源。
通过找寻祖先控件作为自己的源,可以指定是第几层,AncestorLevel属性指定的是以Binding目标控件为起点的层级偏移量。AncestorType属性告诉Binding去找什么类型的对象作为自己的源,不是这个类型的对象会被跳过。
使用Datacontext作为数据源
WPF的UI布局是树形结构,这个树的每个节点都是控件,都有DataContext属性。这一点非常重要,因为当一个Binding只知道自己的Path而不知道自己的源的时候,它会沿着树的一路向树的根部找过去,每经过一个节点都要查看这个节点的DataContext属性是否具有Path所指定的属性,在项目中如果一个对象的数据被频繁的使用,那么可以使用datacontext绑定是一个很常用的方法,当一个绑定没有显式的源对象时,WPF会遍历逻辑树找到一个非空的DataContext。
总结:对于对象间的绑定,绑定源为ElementName,Path为绑定源属性,以下的几个属性是来源之一。
使用集合作为源
在项目开发中会经常使用到集合列表的控件,WPF中的列表式控件都派生自ItemControl类,自然也继承了ItemSource这个属性。ItemSource可以接收一个IEnumerable接口派生类的实例作为自己的值(所有可被迭代遍历的集合都实现了这个接口,所以基本上C#集合都可以作为数据源)。
对于集合的绑定,通常会需要用到以下几个标记:
使用ADO.NET对象作为Binding的源
使用ADO.NET的Dataset对象的DataTable作为数据源。
把ObjectDataProvider指定为Source:当数据源的数据不是通过属性,而是通过方法暴露给外界的时候,我们可以使用这种对象来包装数据源再把它们指定为Source。
使用XmlDataProvider把XML数据指定为Source:一些WPF控件是级联的(如Treeview和Menu),我们可以把树状结构的XML数据作为源指定给与之关联的Binding。
把使用LINQ检索到的数据作为数据源:使用LINQ的查询结果指定为数据源。
多值绑定MultiBinding
当有目标需要多个数据源共同组合的结果时,需要用到多重绑定。可以通过转换器将多个数据源值转换成一个目标值。