什么是模板绑定与绑定?
我无法理解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的工作方式与仅包含Rectangle
的ControlTemplate
。 现在有时候ControlTemplate
有必要实际使用ControlTemplate
逻辑部分的属性。 而这就是TemplateBinding
作用,它只是告诉ControlTemplate
“使用控制的这个属性,我们给的视觉呈现”。 一个很好的例子是每个控件的Background
属性,它本身没有任何意义,它通过TemplateBinding
到ControlTemplate
子控件来获取其意义。
绑定在MSDN中是非常好的。 这是一个非常好的备忘单,实际上挂在我旁边的墙上。 它给出了可用的所有不同绑定的一个很好的概述。
一张图片胜过1000字。 在这种情况下是7分钟的video: https : //www.youtube.com/watch?v = z-0TZR-7xLI
编辑:例如:
- 一个
Button
有一个默认的ControlTemplate
属性和Height
属性 - 您可以通过编写自己的
ControlTemplate
覆盖Button
的ControlTemplate
属性(例如,您想制作一个“Ellipse
button而不是“Rectangle
), - 在新的
ControlTemplate
了一个Ellipse
后,您希望Ellipse
的大小与原始Button的Height
属性相同 - 所以你使用
TemplateBinding
来引用Button
的Height
而不用命名它
从TemplateBinding标记扩展 , TemplateBinding
将控件模板中的属性的值链接到模板控件上其他一些暴露的属性的值。 换句话说,它是为了在模板中绑定值。
绑定连接绑定目标和数据源的属性。