什么是模板绑定与绑定?

时间:2012-05-15 09:08:07

标签: wpf mvvm-light

我无法理解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 个答案:

答案 0 :(得分:181)

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

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

意思是将边框的padding属性绑定到... 的padding属性?你想说,“这个模板用于控件的padding属性。”你不能给它一个名字,因为你不知道x:此时控件的名称(即使你这样做了,它也行不通,因为它在不同的名称范围内)。但是,您可以通过定义相对源

来完成此操作
<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

或使用TemplateBinding,它是上面

的快捷方式(*)
<Border Padding="{TemplateBinding Padding}" ...>

(*)除了在这些模板场景中不那么冗长之外,与常规绑定相比,TemplateBinding有一些不同之处:

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

答案 1 :(得分:46)

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

修改 例如:

  • Button具有默认ControlTemplate属性和Height属性
  • 您可以通过编写自己的ControlTemplate覆盖Button属性(例如,您想要制作一个Ellipse - 按钮而不是Rectangle - 正在寻找
  • 在新EllipseControlTemplate之后,您希望Ellipse的尺寸与原始按钮的Height属性相同
  • 因此,您使用TemplateBinding来引用Button的{​​{1}}而不指定enter image description here

答案 2 :(得分:32)

ErenErsönmenz已经很好地解释了这一点,但我想给它另一个观点来更好地理解这个概念。

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

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

答案 3 :(得分:6)

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

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