{TemplateBinding} 标记扩展

将控件模板中属性的值链接到模板化控件上其他公开属性的值。 TemplateBinding 只能在 XAML 中的 ControlTemplate 定义中使用。

XAML 属性用法

<object propertyName="{TemplateBinding sourceProperty}" .../>

XAML 属性用法(对于模板或样式中的 Setter 属性)

<Setter Property="propertyName" Value="{TemplateBinding sourceProperty}" .../>

XAML 值

术语 Description
propertyName 在 setter 语法中设置的属性的名称。 这必须是依赖属性。
源属性 正在模板化的类型上存在的另一个依赖属性的名称。

注解

使用 TemplateBinding 是定义控件模板的基本部分,不论是作为自定义控件的作者,还是在为现有控件替换控件模板时。 有关详细信息,请参阅 控件模板

propertyNametargetProperty 使用同一属性名称相当常见。 在这种情况下,控件可以定义自身的属性,并将该属性转发到其组件部件之一的现有且直观命名的属性。 例如,在其组合中合并 TextBlock 的控件(用于显示控件自己的 Text 属性)可能包括此 XAML 作为控件模板的一部分: <TextBlock Text="{TemplateBinding Text}" .... />

用作源属性的值的类型和目标属性必须匹配。 使用 TemplateBinding 时,没有机会引入转换器。 未能匹配值会导致分析 XAML 时出错。 如果需要转换器,可以使用模板绑定的显式语法,例如:{Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}

在 XAML 中尝试在 ControlTemplate 定义之外使用 TemplateBinding 将导致分析器错误。

对于模板化父值也作为另一个绑定延迟的情况,可以使用 TemplateBindingTemplateBinding 的评估可以等到任何必需的运行时绑定都有值。

TemplateBinding 始终是单向绑定。 所涉及的这两个属性必须是依赖属性。

TemplateBinding 是标记扩展。 当需要转义属性值,使其不只是字面量值或处理程序名称时,会通常实现标记扩展,因为这种需求不仅仅限于将类型转换器应用于某些类型或属性,而是更为广泛。 XAML 中的所有标记扩展在其属性语法中使用“{”和“}”字符,这是 XAML 处理器识别标记扩展必须处理该属性的约定。

注意 在 Windows 运行时 XAML 处理器实现中, TemplateBinding 没有支持类表示形式。 TemplateBinding 专门用于 XAML 标记。 在代码中重现行为的方法并不简单。

ControlTemplate 中的 x:Bind

注释

在 ControlTemplate 中使用 x:Bind 需要 Windows 10 版本 1809(SDK 17763)或更高版本。 有关目标版本的详细信息,请参阅 版本自适应代码

从 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>