将控件模板中属性的值链接到模板化控件上其他公开属性的值。 TemplateBinding 只能在 XAML 中的 ControlTemplate 定义中使用。
XAML 属性用法
<object propertyName="{TemplateBinding sourceProperty}" .../>
XAML 属性用法(对于模板或样式中的 Setter 属性)
<Setter Property="propertyName" Value="{TemplateBinding sourceProperty}" .../>
XAML 值
| 术语 | Description |
|---|---|
| propertyName | 在 setter 语法中设置的属性的名称。 这必须是依赖属性。 |
| 源属性 | 正在模板化的类型上存在的另一个依赖属性的名称。 |
注解
使用 TemplateBinding 是定义控件模板的基本部分,不论是作为自定义控件的作者,还是在为现有控件替换控件模板时。 有关详细信息,请参阅 控件模板。
propertyName 和 targetProperty 使用同一属性名称相当常见。 在这种情况下,控件可以定义自身的属性,并将该属性转发到其组件部件之一的现有且直观命名的属性。 例如,在其组合中合并 TextBlock 的控件(用于显示控件自己的 Text 属性)可能包括此 XAML 作为控件模板的一部分: <TextBlock Text="{TemplateBinding Text}" .... />
用作源属性的值的类型和目标属性必须匹配。 使用 TemplateBinding 时,没有机会引入转换器。 未能匹配值会导致分析 XAML 时出错。 如果需要转换器,可以使用模板绑定的显式语法,例如:{Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}
在 XAML 中尝试在 ControlTemplate 定义之外使用 TemplateBinding 将导致分析器错误。
对于模板化父值也作为另一个绑定延迟的情况,可以使用 TemplateBinding 。 TemplateBinding 的评估可以等到任何必需的运行时绑定都有值。
TemplateBinding 始终是单向绑定。 所涉及的这两个属性必须是依赖属性。
TemplateBinding 是标记扩展。 当需要转义属性值,使其不只是字面量值或处理程序名称时,会通常实现标记扩展,因为这种需求不仅仅限于将类型转换器应用于某些类型或属性,而是更为广泛。 XAML 中的所有标记扩展在其属性语法中使用“{”和“}”字符,这是 XAML 处理器识别标记扩展必须处理该属性的约定。
注意 在 Windows 运行时 XAML 处理器实现中, TemplateBinding 没有支持类表示形式。 TemplateBinding 专门用于 XAML 标记。 在代码中重现行为的方法并不简单。
ControlTemplate 中的 x:Bind
从 Windows 10 版本 1809 开始,你可以在 ControlTemplate 中任何使用 TemplateBinding 的地方使用 x:Bind 标记扩展。
使用 x:Bind 时,ControlTemplate 上的 TargetType 属性是必需的(不是可选的)。
借助 x:Bind 支持,可以在 ControlTemplate 中使用函数绑定和双向绑定。
在此示例中, TextBlock.Text 属性的计算结果为 Button.Content.ToString。 ControlTemplate 上的 TargetType 充当数据源,并实现与 TemplateBinding 相同的父级结果。
<ControlTemplate TargetType="Button">
<Grid>
<TextBlock Text="{x:Bind Content, Mode=OneWay}"/>
</Grid>
</ControlTemplate>