什么是模板绑定与普通数据绑定?

134

我无法理解 BorderThickness="{TemplateBinding BorderThickness}

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

还请解释其他类型的绑定。


为什么要返回这个值并且为什么要两次写入BorderThickness,即"""BorderThickness="{TemplateBinding BorderThickness}"""? - prjndhi
1
@Euphoric 这个页面似乎是该查询的谷歌搜索结果中的第一个。 ;) - ANeves
4个回答

226

TemplateBinding用于绑定模板定义内部的元素属性。在您的示例中,您可以编写:

 <Border Padding="{Binding Padding}" ...>

您想将边框的填充属性绑定到模板所用控件的填充属性,但是又不知道该控件的x:Name(即使知道也行不通,因为它在不同的命名作用域中)。您可以通过定义相对源来实现这一点。

<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

或者使用TemplateBinding,它是上面方法的一种快捷方式(*)。

<Border Padding="{TemplateBinding Padding}" ...>

(*) 除了在这些模板化场景下更为简洁之外,TemplateBinding与常规绑定相比有几个不同之处:

  • 它是在编译时进行评估的。(例如,如果Padding属性不存在,则会出现编译错误。但是,如果您使用一个与TemplatedParent相关联的绑定,则只会在运行时看到该错误。)
  • 它始终是单向绑定。
  • 它要求源和目标属性都是 依赖属性
  • 它的功能要少得多(没有StringFormat、Delay、IsAsync等……请参见BindingTemplateBindingExtention的属性)。

83

一张图片胜过千言万语。在这种情况下,它是一个7分钟的视频:https://www.youtube.com/watch?v=z-0TZR-7xLI

编辑: 示例:

  • Button有一个默认的ControlTemplate属性和Height属性
  • 通过编写您自己的ControlTemplate(例如,您想要创建一个看起来像椭圆形而不是矩形的
  • 在您的新ControlTemplate中制作一个Ellipse后,希望Ellipse与原始ButtonHeight属性相同大小
  • 因此,您可以使用TemplateBinding来引用ButtonHeight属性,而无需命名它enter image description here

1
这张图片非常有帮助。谢谢! - Tea

35
Eren Ersönmenz已经解释得很好了,但我想从另一个角度来理解这个概念。 在WPF中,每个控件与其呈现方式或多或少是分离的。您可以随时更改控件的模板并使其看起来完全不同。例如,只有包含RectangleControlTemplate时,按钮仍能正常工作。现在有时需要将ControlTemplate实际使用控件逻辑部分的属性。这就是TemplateBinding的用途,它告诉ControlTemplate:“使用我们正在提供视觉展示的控件的此属性”。 每个控件上都有Background属性是一个很好的例子,它本身没有意义,通过TemplateBinding将其绑定到ControlTemplate中的子控件才具有意义。
绑定本身在MSDN中有很好的描述。 这份很棒的备忘单挂在我旁边的墙上。它提供了所有可用绑定的良好概述。

6

来自模板绑定标记扩展TemplateBinding将控件模板中的属性值链接到模板化控件上的其他公开属性的值。换句话说,它用于在模板中绑定值。

绑定连接绑定目标和数据源的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接