{TemplateBinding} 标记扩展

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

XAML 属性使用方法

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

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

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

XAML 值

术语 说明
propertyName 在 setter 语法中设置的属性的名称。 这必须是一个依赖属性。
sourceProperty 存在于模板化的类型上的其他依赖属性的名称。

注解

如果你是自定义控件的作者或者要替换现有控件的控件模板,使用 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>