123

我无法理解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>

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

4

4 回答 4

215

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的属性)。
于 2012-05-15T09:25:47.427 回答
71

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

编辑: 示例:

  • AButton有一个默认ControlTemplate属性和Height属性
  • 您通过编写自己的来覆盖ControlTemplatea 的属性(例如,您想制作一个-looking 按钮而不是-looking )ButtonEllipseRectangle
  • 在你Ellipse的 new 中创建后ControlTemplate,你希望 与原始 Button 的属性Ellipse大小相同Height
  • 所以你使用TemplateBinding为了引用Button'sHeight而不是命名它在此处输入图像描述
于 2016-03-11T16:23:35.683 回答
32

Eren Ersönmenz 已经很好地解释了它,但我想给它另一个视角以更好地理解这个概念。

在 WPF 中,每个控件都或多或少地与其表示分离。您可以随时更改控件模板并使其看起来完全不同。按钮按预期工作,ControlTemplate仅由Rectangle例如 a 组成。现在有时需要ControlTemplate实际使用控件逻辑部分的属性。这就是它的用途TemplateBinding,它只是告诉ControlTemplate“使用我们提供视觉呈现的控件的这个属性”。一个很好的例子是Background每个控件上的属性,它本身没有意义,它通过TemplateBinding它来获取它的意义给ControlTemplate.

MSDN中对绑定本身进行了很好的描述。是一张非常漂亮的备忘单,实际上它就挂在我旁边的墙上。它很好地概述了所有可用的不同绑定。

于 2012-05-15T09:33:57.917 回答
6

TemplateBinding Markup ExtensionTemplateBinding将控件模板中的属性值链接到模板化控件上的某些其他公开属性的值。换句话说,它用于绑定模板中的值。

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

于 2012-05-15T09:29:23.580 回答