本主题讨论声明绑定的不同方法
先决条件
在阅读本主题之前应当先熟悉标记扩展的概念和使用这一点非常重要
本主题不介绍数据绑定的概念
在 XAML 中声明绑定
本节讨论如何在可扩展应用程序标记语言 (XAML) 中声明绑定
标记扩展使用
Binding 是标记扩展当您使用绑定扩展来声明绑定时声明包含一系列子句这些子句跟在 Binding 关键字后面并由逗号 () 分隔绑定声明中的子句可以按任意顺序排列因此有许多可能的组合子句是名称=值 对其中名称 是 Binding 属性值 是您要为该属性设置的值
当在标记中创建绑定声明字符串时必须将它们附加到目标对象的特定依赖项属性下面的示例演示如何通过使用绑定扩展并指定 SourcePath 和 UpdateSourceTrigger 属性来绑定 TextBoxText 属性
您可以通过这种方法来指定 Binding 类的大部分属性
对象元素语法
对象元素语法是创建绑定声明的另一种方法在大多数情况下使用标记扩展或对象元素语法没有特定的优势但是在标记扩展不支持您的方案的情况下例如当您的属性值是不存在类型转换的非字符串类型时您将需要使用对象元素语法
下面是对象元素语法和标记扩展使用的一个示例
此示例通过使用扩展语法声明绑定来绑定 Foreground 属性Text 属性的绑定声明使用对象元素语法
MultiBinding 和 PriorityBinding
MultiBinding 和 PriorityBinding 不支持 XAML 扩展语法因此如果您要在 XAML 中声明 MultiBinding 或 PriorityBinding则必须使用对象元素语法
在代码中创建绑定
指定绑定的另一种方法是在代码中直接为 Binding 对象设置属性下面的示例演示如何在代码中创建 Binding 对象并指定属性
如果您要绑定的对象是 FrameworkElement 或 FrameworkContentElement则您可以直接对该对象调用 SetBinding 方法而不是使用 BindingOperations::SetBinding
绑定路径语法
使用 Path 属性可以指定您要绑定到的源值
在最简单的情况下Path 属性值是要用于绑定的源对象的属性名如 Path=PropertyName
在 C# 中可以通过类似语法指定属性的子属性例如子句 Path=ShoppingCartOrder 设置与对象或属性 ShoppingCart 的 Order 子属性的绑定
若要绑定到附加属性应在附加属性周围放置圆括号例如若要绑定到附加属性 DockPanel::Dock则语法是 Path=(DockPanelDock)
可以在要应用索引器的属性名后面的方括号内指定属性的索引器例如子句 Path=ShoppingCart[] 将绑定设置为与属性的内部索引处理文本字符串的方式对应的索引还支持嵌套的索引器
可以在 Path 子句中混合索引器和子属性例如Path=ShoppingCartShippingInfo[MailingAddressStreet]
在索引器内部您可以有多个由逗号 () 分隔的索引器参数可以使用圆括号指定每个参数的类型
例如您可以有 Path=[(sys:Int)(sys:Int)]其中 sys 映射到 System 命名空间
转义机制
在索引器 ([ ]) 内部插入符号 (^) 用于对下一个字符进行转义
如果您在 XAML 中设置 Path则还需要使用 XML 实体对 XML 分析程序专用的某些字符进行转义
使用 & 对字符&进行转义
使用 > 对结束标记>进行转义
此外如果您使用标记扩展语法描述属性中的整个绑定则需要使用反斜槓 \ 对 WPF 标记扩展分析程序专用的字符进行转义
反斜槓 \ 本身是转义字符
等号 (=) 将属性名与属性值隔开
逗号 () 用于分隔属性
右大括号 (}) 是标记扩展的结尾
默认行为 如果未在声明中指定默认行为则默认行为如下
创建一个尝试在绑定源值与绑定目标值之间执行类型转换的默认转换器如果无法进行转换则默认转换器会返回 null
如果您不设置 ConverterCulture则绑定引擎会使用绑定目标对象的 Language 属性在 XAML 中此属性默认为enUS或者从页面的根元素(或任何元素)继承值(如果已显式设置了一个值)
只要绑定已有数据上下文(例如来自父元素的继承数据上下文)并且该上下文所返回的项或集合适合于绑定而不需要进一步的路径修改则绑定声明可以不必有任何子句{Binding}在绑定作用于集合的情况下这通常是为数据样式指定绑定的方式
默认 Mode 可能是单向也可能是双向具体取决于所绑定的依赖项属性您始终可以显式声明绑定模式以确保绑定具有所需的行为通常用户可编辑的控件属性(如 TextBox::Text 和 RangeBase::Value)默认为双向绑定而其他大多数属性默认为单向绑定
默认 UpdateSourceTrigger 值可能是 PropertyChanged也可能是 LostFocus具体也取决于所绑定的依赖项属性多数依赖项属性的默认值都为 PropertyChanged而 TextBox::Text 属性的默认值为 LostFocus