将元素绑定在一起
数据绑定最简单的形式是:源对象是WPF元素而且源属性是依赖项属性。依赖项属性内置了更改通知支持,当源对象中改变依赖项属性时,会立即更新目标对象的绑定属性。
元素绑定到元素也是经常使用的,可以使元素的交互自动化,而不必编写代码。
绑定表达式 Visibility="{Binding Path=IsChecked, ElementName=rdKer, Converter={StaticResource EqualVisibleConverter}, ConverterParameter=1}"此处绑定设置两个属性,ElementName属性指示源元素,Path属性指示源元素的属性。此处使用Path而不是Property,是因为Path可能指向属性的属性,也可能指向属性的索引器,用于构建多层次路径。
绑定错误WPF不会引发异常类通知与数据绑定相关的问题,如果指定的元素不存在或者属性不存在,那么不会收到任何指示,只是不能在目标属性中显示数据。
绑定模式 名称 说明OneWay 当源属性变化时更新目标属性
TwoWay 源属性变化时更新目标属性,目标属性变化时更新源属性
OneTime 最初根据源属性值设定目标属性值。然而,其后的所有改变都会被忽略(除非绑定被设置为一个完全不同的对象或者调用UpdateTarget()方法)。如果源属性不变化,可使用这种模式降低开销
OneWayToSource 和OneWay类似,但方向相反。当目标属性发生变化时更新源属性,但目标属性永远不会被更新
Default 此类绑定依赖于目标属性。既可以是双向的,也可以是单向的。除非明确另一种模式,否则所有绑定都是用该方法。
使用代码创建绑定
基于标记的绑定比通过代码创建的绑定常见。除非一些特殊情况:
创建动态绑定:如果希望根据运行时修改绑定,或者根据环境创建不同的绑定,这时使用代码创建绑定通常更合理(也可以在窗口的Resources集合中定义可能希望使用的每个绑定,并且添加使用合适的绑定对象调用SetBinding()的代码)
删除绑定:如果希望删除绑定,从而可以通过普通方式设置属性,需要借助ClearBinding()或者ClearAllBindings()方法。仅为属性应用新值是不够的-如果正在使用双向绑定,设置的值会传播到链接的对象,并且两个属性保持同步。
创建自定义控件:为让他人能够更容易地修改您构建的自定义控件外观,需要将特定细节(如事件处理程序和数据绑定表达式)从标记移到代码中。
使用代码检索绑定可使用代码检索绑定并检查其属性,而不必考虑绑定最初是用代码还是标记创建的。
使用静态方法BindingOperations.GetBinding()来检索相应的Binding对象,分别传入绑定元素和具有绑定表达式的属性。可以通过Binding对象获取其各种属性
通过调用BindingOperations.GetBindingExpression()方法获取更加实用的BindingExpression对象,和上面的参数相同。
绑定更新数据源的变化会立即影响目标,但是目标到源未必立即执行、这个行为由Binding.UpdateSourceTrigger属性控制。
名称 说明PropertyChanged 当目标属性发生变化时立即更新源
LostFocus 当目标属性发生变化并且目标丢失焦点时更新源
Explicit 除非调用BindingExpression.UpdateSource()方法,否则无法更新
Default 根据目标属性的元素确定更新行为(从技术角度看,是根据FrameworkPropertyMetadata.DefaultUpdateSourceTrigger属性决定更新行为)。大多数默认是PropertyChanged,但是TextBox.Text是LostFocus
绑定延迟
在极少数情况下,需要防止数据绑定触发操作和修改源对象,至少在某一段时间内时这样的。可能要添加短暂的延时时间,避免过分频繁地触发操作,需要使用Binding对象的Delay属性,等待数毫秒之后再提交更改。
绑定到非元素对象在数据驱动的应用程序中,更多的操作是创建从不可见对象中提取数据的绑定表达式。唯一的要求是显示的信息必须是公有属性,不能采用私有信息或者字段。当绑定到非元素对象时,需要设置数据源,而不是使用Binding.ElementName属性
Source属性该属性是指向源对象的引用,也就是提供数据的对象。
RelativeSource属性这是引用,使用RelativeSource对象指向源对象。可以在当前元素的基础上构建引用,在编写控件模板以及数据模板是很方便。RelativeSource的4中模式:
名称 说明Self 表达式绑定到同一元素的另一个属性上
FindAncestor 绑定到父元素,WPF将查找元素树直到发现期望的父元素。为了指定父元素,还必须设置AncestorType属性以提示希望查找的父元素的类型。还可以使用AncestorLevel属性略过一定数量的特定元素。比如AncestorTpye={x:Type ListBoxItem}并且AncestorLevel=3,标识希望绑定到第3个ListBoxItem(从当前节点沿着树查找),默认情况下AncestorLevel=1
PreviousData 表达式绑定到数据绑定列表中的前一个数据项,在列表项中会使用这种模式
TemplateParent 表达式绑定到应用模板的元素。只有当绑定位于控件模板或者数据模板内部时,这种模式才会工作
DataContext属性
如果没有指定Source或者RelativeSource属性数据源,WPF就从当前元素开始在元素树上向上查找,直到第一个非空 的DataContext属性。
数据绑定WPF数据绑定允许创建从任何对象的任何属性获取信息的绑定,并且可以使用创建的绑定填充任何元素的任何属性。
使用自定义对象绑定到数据库数据库中的提取信息,然后转换成自定义的对象中,将自定义对象作为数据源绑定到控件中进行显示某些属性。