什么是模板绑定与绑定?

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

另外请解释其他types的绑定。

TemplateBinding用于绑定到模板定义中的元素属性。 在你的例子中,你可以写

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

这意味着将边框的填充属性绑定到…的填充属性 你想说的是:“这个模板被用于控制的填充属性”。 你不能给它一个名字,因为你不知道这个时候控件的名字(即使你做了,也不会工作,因为它在不同的名字范围中)。 但是,您可以通过定义相对来源来做到这一点

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

或者使用上面的快捷方式(*)的TemplateBinding

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

(*)除了在这些模板场景中较less详细信息之外,与常规绑定相比,TemplateBinding还有一些不同之处:

  • 它在编译时被评估。 (例如,如果Padding属性不存在,则会出现编译错误,但是如果要使用与TemplatedParent绑定,则只会在运行时看到错误。
  • 它总是一个单向的约束。
  • 它要求源和目标属性都是依赖项属性
  • 它具有更less的function(没有StringFormat,延迟,IsAsync等等,请参阅Binding vs TemplateBindingExtention的属性)。

ErenErsönmenz已经很好的解释了这一点,但是我想给出一个更好的理解这个概念的观点。

在WPF中,每个控件都或多或less地与其呈现相分离。 您可以随时更改控件的模板,使其看起来完全不同。 button的工作方式与仅包含RectangleControlTemplate 。 现在有时候ControlTemplate有必要实际使用ControlTemplate逻辑部分的属性。 而这就是TemplateBinding作用,它只是告诉ControlTemplate “使用控制的这个属性,我们给的视觉呈现”。 一个很好的例子是每个控件的Background属性,它本身没有任何意义,它通过TemplateBindingControlTemplate子控件来获取其意义。

绑定在MSDN中是非常好的。 这是一个非常好的备忘单,实际上挂在我旁边的墙上。 它给出了可用的所有不同绑定的一个很好的概述。

一张图片胜过1000字。 在这种情况下是7分钟的video: https : //www.youtube.com/watch?v = z-0TZR-7xLI

编辑:例如:

  • 一个Button有一个默认的ControlTemplate属性和Height属性
  • 您可以通过编写自己的ControlTemplate覆盖ButtonControlTemplate属性(例如,您想制作一个“ Ellipsebutton而不是“ Rectangle ),
  • 在新的ControlTemplate了一个Ellipse后,您希望Ellipse的大小与原始Button的Height属性相同
  • 所以你使用TemplateBinding来引用ButtonHeight而不用命名它 在这里输入图像说明

从TemplateBinding标记扩展 , TemplateBinding将控件模板中的属性的值链接到模板控件上其他一些暴露的属性的值。 换句话说,它是为了在模板中绑定值。

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