将控件模板中属性的值链接到模板化控件上其他公开属性的值。 TemplateBinding 只能在 XAML 中的 ControlTemplate 定义中使用。
XAML 属性用法
<object propertyName="{TemplateBinding sourceProperty}" .../>
XAML 属性用法(对于模板或样式中的 Setter 属性)
<Setter Property="propertyName" Value="{TemplateBinding sourceProperty}" .../>
XAML 值
术语 | DESCRIPTION |
---|---|
属性名称 | 在 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>