WPF进阶技巧和实战08-依赖属性与绑定02

将元素绑定在一起

数据绑定最简单的形式是:源对象是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数据绑定允许创建从任何对象的任何属性获取信息的绑定,并且可以使用创建的绑定填充任何元素的任何属性。

使用自定义对象绑定到数据库

数据库中的提取信息,然后转换成自定义的对象中,将自定义对象作为数据源绑定到控件中进行显示某些属性。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjzpy.html