注释
新的绑定机制适用于 Windows 10,该机制针对性能和开发人员工作效率进行优化。 请参阅 {x:Bind} 标记扩展。
注释
有关在应用中使用 {Binding} 进行数据绑定的一般信息(以及 {x:Bind} 和 {Binding} 之间的全面比较),请参阅 深入数据绑定。
{Binding} 标记扩展用于将控件上的属性与来自数据源(如代码)的值进行数据绑定。 {Binding} 标记扩展在 XAML 加载时转换为 Binding 类的实例。 此绑定对象从数据源上的属性获取值,并将其推送到控件上的属性。 绑定对象可以选择性地配置为观察数据源属性值的变化,并根据这些更改自行更新。 还可以选择性地将其配置为将控件的值的更改推送回源属性。 作为数据绑定目标的属性必须是依赖属性。 有关详细信息,请参阅 依赖项属性概述。
{Binding} 的依赖属性优先级与本地值相同,在命令性代码中设置本地值会删除标记中设置的任何 {Binding} 的效果。
XAML 属性用法
<object property="{Binding}" .../>
-or-
<object property="{Binding propertyPath}" .../>
-or-
<object property="{Binding bindingProperties}" .../>
-or-
<object property="{Binding propertyPath, bindingProperties}" .../>
| 术语 | Description |
|---|---|
| propertyPath | 一个字符串,指定绑定的属性路径。 有关详细信息,请参阅下面的 “属性路径 ”部分。 |
| bindingProperties |
propName=value[, propName=value]* 使用名称/值对语法指定的一个或多个绑定属性。 |
| propName | 要对 Binding 对象设置的属性的字符串名称。 例如,“转换器”。 |
| value | 要设置属性的值。 参数的语法取决于 可以通过 {Binding} 设置的下述 Binding 类的属性。 |
属性路径
路径 描述要绑定到的属性(源属性)。 路径是一个位置参数,这意味着可以显式使用参数名称({Binding Path=EmployeeID}),也可以将其指定为第一个未命名参数({Binding EmployeeID})。
Path 的类型是属性路径,这个路径是一个字符串,它会被解析为自定义类型或框架类型的属性或子属性。 类型可以是 DependencyObject,但不需要是。 属性路径中的步骤由点(.)分隔,可以包含多个分隔符来遍历连续子属性。 无论用于实现绑定到的对象的编程语言如何,都使用点分隔符。
例如,若要将 UI 绑定到员工对象的名字属性,属性路径可能是“Employee.FirstName”。 如果要将项控件绑定到包含员工依赖项的属性,则属性路径可能是“Employee.Dependents”,而项目控件的项模板将负责在“依赖项”中显示项。
如果数据源是集合,则属性路径可以通过集合中的位置或索引指定项。 例如,“Teams[0].Players”,其中的“[]”将集合中的第一项“0”括起来。
使用 ElementName 绑定到现有 DependencyObject 时,可以将附加属性用作属性路径的一部分。 若要消除附加属性的歧义,以便附加属性名称中的中间点不被视为属性路径中的一个步骤,请将括号放在所有者限定的附加属性名称周围:例如, (AutomationProperties.Name).
属性路径中间对象作为 PropertyPath 对象存储在运行时表示形式中,但大多数方案不需要在代码中与 PropertyPath 对象交互。 通常可以使用 XAML 指定所需的绑定信息。
有关属性路径的字符串语法、动画特征区域中的属性路径以及构造 PropertyPath 对象的详细信息,请参阅 Property-path 语法。
可以使用 {Binding} 设置的 Binding 类的属性
{Binding} 通过 bindingProperties 占位符语法进行说明,因为Binding有多个读/写属性可以在标记扩展中设置。 可以按任意顺序使用逗号分隔的 propName=value 对来设置属性。 由于某些属性所需的类型没有类型转换,因此这些属性需要在 {Binding} 中嵌套其自己的标记扩展。
| 资产 | Description |
|---|---|
| 路径 | 请参阅上面的 “属性路径 ”部分。 |
| 转换器 | 指定绑定引擎调用的转换器对象。 可以使用 {StaticResource} 标记扩展在标记 中设置转换器,以从资源字典引用该对象。 |
| ConverterLanguage | 指定转换器要使用的文化设置。 (如果要设置 转换器。)区域性设置为基于标准的标识符。 有关详细信息,请参阅 ConverterLanguage |
| ConverterParameter | 指定可在转换器逻辑中使用的转换器参数。 (如果要设置 转换器。)大多数转换器使用简单的逻辑从传递的值获取所需的全部信息来转换,并且不需要 ConverterParameter 值。 ConverterParameter 参数适用于更复杂的转换器实现,这些实现具有条件逻辑,用于关闭 ConverterParameter 中传递的内容。 可以编写使用字符串以外的值的转换器,但这种情况并不常见,有关详细信息,请参阅 ConverterParameter 中的备注。 |
| ElementName | 通过引用同一 XAML 构造中具有 Name 属性或 x:Name 属性的另一个元素来指定数据源。 这通常用于共享相关值,或使用一个 UI 元素的子属性为另一个元素提供特定值,例如在 XAML 控件模板中。 |
| FallbackValue | 指定要在无法解析源或路径时显示的值。 |
| 模式 | 将绑定模式指定为以下值之一:“OneTime”、“OneWay”或“TwoWay”。 这些值对应于 BindingMode 枚举的常量名称。 默认值为“OneWay”。 请注意,这不同于 {x:Bind} 的默认值,即“OneTime”。 |
| RelativeSource | 通过描述绑定源相对于绑定目标位置的位置来指定数据源。 这最常用于 XAML 控件模板中的绑定。 设置 {RelativeSource} 标记扩展。 |
| 源 | 指定对象数据源。 在 绑定 标记扩展中, Source 属性需要对象引用,例如 {StaticResource} 标记扩展 引用。 如果未指定此属性,则代理数据上下文指定源。 更典型的是不要在单个绑定中指定 Source 值,而是依赖于在多个绑定中共享的 DataContext。 有关详细信息,请参阅 DataContext 或数据绑定。 |
| TargetNullValue | 指定在源值解析但显式 为 null 时要显示的值。 |
| UpdateSourceTrigger | 指定绑定源更新的时间安排。 如果未指定,则默认值为 Default。 |
注释
如果要将标记从 {x:Bind} 转换为 {Binding},请注意 Mode 属性的默认值之间的差异。
转换器、 ConverterLanguage 和 ConverterLanguage 都与将值或类型从绑定源转换为与绑定目标属性兼容的类型或值的方案相关。 有关详细信息和示例,请参阅 数据绑定的“数据转换”部分。
注释
从 Windows 10 版本 1607 开始,XAML 框架提供内置布尔值到 Visibility 转换器。 转换器将 true 映射到 Visible 枚举值, 将 false 映射到 Collapsed ,以便无需创建转换器即可将 Visibility 属性绑定到布尔值。 若要使用内置转换器,应用的最低目标 SDK 版本必须为 14393 或更高版本。 当应用面向早期版本的 Windows 10 时,不能使用它。 有关目标版本的详细信息,请参阅 版本自适应代码。
Source、 RelativeSource 和 ElementName 指定绑定源,因此它们互斥。
小窍门
如果需要为值指定单个大括号,例如Path 或 ConverterParameter,请在前面加上反斜杠:\{ 或者,将包含需要转义的大括号的整个字符串使用辅助引号括起来,例如 ConverterParameter='{Mix}'。
例子
<!-- binding a UI element to a view model -->
<Page ... >
<Page.DataContext>
<local:BookstoreViewModel/>
</Page.DataContext>
<GridView ItemsSource="{Binding BookSkus}" SelectedItem="{Binding SelectedBookSku, Mode=TwoWay}" ... />
</Page>
<!-- binding a UI element to another UI element -->
<Page ... >
<Page.Resources>
<local:S2Formatter x:Key="GradeConverter"/>
</Page.Resources>
<Slider x:Name="sliderValueConverter" ... />
<TextBox Text="{Binding Path=Value, ElementName=sliderValueConverter,
Mode=OneWay,
Converter={StaticResource GradeConverter}}"/>
</Page>
第二个示例设置四个不同的 绑定 属性: ElementName、 Path、 Mode 和 Converter。 在本例中,路径被明确指定为 Binding 属性。
路径的计算结果为数据绑定源,该源是同一运行时对象树中的另一个对象,名为 SlidersliderValueConverter。
请注意 转换器 属性值是如何使用另一个标记扩展 {StaticResource} 标记扩展 的,因此这里有两个嵌套的标记扩展用法。 在内部元素首先被评估,以便在获取资源后,有一个绑定可以使用的实用 IValueConverter(这是由资源中的 local:S2Formatter 元素实例化的自定义类)。
工具支持
Microsoft Visual Studio 中的 Microsoft IntelliSense 在 XAML 标记编辑器中创作 {Binding} 时显示数据上下文的属性。 键入“{Binding”后,下拉列表中会显示与 Path 相关的数据环境属性。 IntelliSense 还有助于 绑定的其他属性。 要实现此功能,必须在标记页面中设置数据上下文或设计时数据上下文。 转到定义(F12)同样适用于{Binding}。 或者,可以使用数据绑定对话框。