模板绑定与绑定是什么?


118

我听不懂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 2012年

1
@Euphoric此页面似乎是该查询的第一个Google搜索结果。;)
ANeves 2014年

Answers:


204

TemplateBinding用于绑定到模板定义内的元素属性。在您的示例中,您可能已经写了

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

意味着将边框的padding属性绑定到...的padding属性您想要说的是“此模板用于的控件的填充属性”。您不能给它起一个名字,因为此时您不知道控件的x:Name(即使您知道了它,也不会起作用,因为它在另一个名称范围中)。但是,您可以通过定义相对源来实现

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

或使用TemplateBinding,它是上述的快捷方式(*)

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

(*)除了在这些模板化场景中不太冗长之外,TemplateBinding与常规绑定相比还具有一些区别:

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

58

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

编辑: 示例:

  • 一个Button具有默认ControlTemplate属性和Height属性
  • 您可以通过编写自己的ControlTemplate属性来覆盖a Button的属性(例如,您要使一个Ellipse-look按钮而不是Rectangle-look)
  • Ellipsenew中创建一个后ControlTemplate,您希望该Ellipse尺寸与原始Button Height属性的尺寸相同
  • 所以,你使用TemplateBinding以参考ButtonHeight,而不将其命名为在此处输入图片说明

虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Bhargav Rao

32

ErenErsönmenz已经很好地解释了它,但是我想换一个角度更好地理解这个概念。

在WPF中,每个控件或多或少都与它的表示分离。您始终可以更改控件模板,并使它们看起来完全不同。一个按钮按预期工作,ControlTemplate仅包含一个Rectangle,例如。现在,有时有必要ControlTemplate实际使用控件逻辑部分的属性。这就是TemplateBinding它的意思,它只是告诉ControlTemplate“使用控件的此属性,我们将提供视觉呈现”。一个很好的例子是Background每个控件上的属性,它本身没有任何意义,它通过TemplateBinding赋予子控件以其含义ControlTemplate

MSDN很好地描述了绑定本身。是一个非常不错的备忘单,实际上挂在我旁边的墙上。它很好地概述了所有可用的不同绑定。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.