{Binding} 标记扩展
注意
新的绑定机制可用于 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}" .../>
术语 | 说明 |
---|---|
propertyPath | 一个指定绑定的属性路径的字符串。 下面的属性路径部分中提供了更多信息。 |
bindingProperties | propName=value[, propName=value]* 使用一个名称/值对语法指定的一个或多个绑定属性。 |
propName | 要在 Binding 对象上设置的属性的字符串名称。 例如,“Converter”。 |
value | 要将属性设置为的值。 参数的语法取决于下面的可使用 {Binding} 设置的 Binding 类的属性部分的属性。 |
属性路径
路径描述你要绑定到的属性(源属性)。 Path 是位置参数,这意味着可显式使用参数名称 ({Binding Path=EmployeeID}
),或者将其指定为第一个未命名的参数 ({Binding EmployeeID}
)。
Path 类型为属性路径,其求值结果为自定义类型或框架类型的属性或子属性的字符串。 该类型可能是(但并不一定是)DependencyObject。 属性路径中的步骤由点号 (.) 分隔,并且可包含多个分隔符以遍历连续的子属性。 无论使用何种编程语言,均可将点号分隔符用于实现要绑定到的对象。
例如,若要将 UI 绑定到员工对象的第一个名称属性,属性路径可能是“Employee.FirstName”。 如果将一个项目控件绑定到一个包含员工家属的属性,则属性路径可能是“Employee.Dependents”,并且项目控件的项目模板将负责显示“Dependents”中的项。
如果数据源是一个集合,则属性路径可以按照位置或索引来指定集合中的项目。 例如,“Teams[0].Players”,其中文本“[]”包含指定集合中第一项的“0”。
当使用绑定到现有 DependencyObject 的 ElementName 时,你可以使用附加属性作为属性路径的一部分。 若要消除附加属性的多义性,以使附加属性名称中的中间点不被视为属性路径中的一个步骤,可以将所有者限定的附加属性名称放在圆括号中;例如 (AutomationProperties.Name)
。
属性路径中间对象作为 PropertyPath 对象存储在运行时表示形式中,但大多数情况不需要与代码中的 PropertyPath 对象交互。 通常,可以使用 XAML 来指定所需的绑定信息。
有关属性路径的字符串语法、动画功能区域中的属性路径和构造 PropertyPath 对象的详细信息,请参阅 Property-path 语法。
可使用 {Binding} 设置的 Binding 类的属性
{Binding} 是使用 bindingProperties 占位符语法进行说明的,因为一个绑定有多个可以在标记扩展中设置的读/写属性。 这些属性可按任何顺序设置,并带有以逗号分隔的 propName=value 对。 由于其中一些属性需要不具有类型转换的类型,因此它们需要一些自己嵌套在 {Binding} 内的标记扩展。
属性 | 说明 |
---|---|
Path | 请参阅上面的属性路径部分。 |
Converter | 指定绑定引擎所调用的转换器对象。 可使用 {StaticResource} 标记扩展在标记中设置转换器,以从资源字典引用该对象。 |
ConverterLanguage | 指定转换器要使用的区域性。 (如果要设置 Converter。)区域性可设置为一个基于标准的标识符。 有关详细信息,请参阅 ConverterLanguage |
ConverterParameter | 指定可在转换器逻辑中使用的转换器参数。 (如果要设置 Converter。)大多数转换器使用可从要转换的传递值获取所有所需信息的简单逻辑,不需要 ConverterParameter 值。 ConverterParameter 参数适用于具有条件逻辑的更复杂转换器实现,这些逻辑可切断传入 ConverterParameter 的内容。 你可以编写一个转换器,使用除字符串之外的值,但这种情况并不常见,请参阅 ConverterParameter 中的备注获取详细信息。 |
ElementName | 通过引用同一个 XAML 构造中的另一个元素(具有 Name 属性或 x:Name 属性)来指定数据源。 这种方法通常用于共享相关值,或者使用一个 UI 元素的子属性为另一个元素提供特定值,例如在 XAML 控件模板中。 |
FallbackValue | 指定要在无法解析源或路径时显示的值。 |
模型 | 将绑定模式指定为以下值之一:“OneTime”、“OneWay”或“TwoWay”。 这些模式对应于 BindingMode 枚举的常量名称。 默认值是“OneWay”。 请注意,这与 {x:Bind} 的默认值“OneTime”不同。 |
RelativeSource | 通过描述绑定源的位置相对于绑定目标的位置指定数据源。 这在 XAML 控件模板内的绑定中最常用。 设置 {RelativeSource} 标记扩展。 |
源 | 指定对象数据源。 在 Binding 标记扩展中,Source 属性需要一个对象引用,例如 {StaticResource} 标记扩展引用。 如果未指定此属性,则操作数据上下文指定来源。 更加常见的做法是不在单个绑定中指定 Source 值,而是依赖于共享的 DataContext 进行多个绑定。 有关详细信息,请参阅 DataContext 或深入了解数据绑定。 |
TargetNullValue | 指定要在源值解析但并非显式 null 时显示的值。 |
UpdateSourceTrigger | 指定绑定源更新的定时。 如果没有指定,则默认值为 Default。 |
注意 如果你要将标记从 {x:Bind} 转换为 {Binding},请注意在 Mode 属性默认值方面的差异。
Converter、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>
第二个示例设置了以下四个不同的 Binding 属性:ElementName、Path、Mode 和 Converter。 在此情形下,Path 会显式显示出来,被命名为一个 Binding 属性。 Path 的求值结果是一个数据绑定源,该绑定源是同一个运行时对象树中的另一个对象(即,名为 sliderValueConverter
的 Slider)。
请注意 Converter 属性值如何使用另一个标记扩展 {StaticResource} 标记扩展,以便在这里有两个嵌套标记扩展用法。 内部嵌套先求值,以便在获取资源之后,有一个可以由绑定使用的实际 IValueConverter(一个由资源中的 local:S2Formatter
元素实例化的自定义类)。
工具支持
当在 XAML 标记编辑器中创作 {Binding} 时,Microsoft Visual Studio 中的 Microsoft IntelliSense 将显示数据上下文的相关属性。 只要你键入“{Binding”,适合 Path 的数据上下文属性便会显示在下拉列表中。 IntelliSense 对 Binding 的其他属性也能起到帮助作用。 为实现此操作,你必须在标记页中设置数据上下文或设计时数据上下文。 “转到定义”(F12) 也适用于 {Binding}。 或者,你也可以使用数据绑定对话框。