什么是模板绑定和绑定?
在WPF中,每个控件在很大程度上都与其展示分离。您始终可以更改控件的模板,并使其看起来完全不同。例如,一个仅由Rectangle
组成的ControlTemplate
的按钮可以按预期工作。现在,有时ControlTemplate
实际上需要使用控件的逻辑部分的属性。这就是TemplateBinding
的作用,它只是告诉ControlTemplate
“使用我们正在提供视觉呈现的控件的此属性”。
一个很好的例子是每个控件上的Background
属性,它本身没有意义,它通过TemplateBinding
将其传递给ControlTemplate
中的子控件来获得其含义。
绑定本身在MSDN中有很好的描述。 这个是一个非常好的备忘单,实际上挂在我旁边的墙上。它提供了所有不同绑定的很好的概述。
请参考以下示例代码:
在上面的示例中,我们创建了一个简单的按钮,并将其背景颜色设置为红色。我们使用了TemplateBinding
来将按钮的Background
属性传递给ControlTemplate
中的Border
控件的Background
属性。这样,按钮的背景颜色将应用于Border
控件。
通过使用TemplateBinding
,我们可以在控件的外观模板中使用控件的属性,以实现更多的自定义和灵活性。
问题的出现原因是在自定义控件模板时,希望用原始控件的属性值来设置模板中的某些元素的属性。使用Binding可以实现这一目的,但是由于在控件模板中,无法直接使用Binding来引用控件的属性。因此,需要使用TemplateBinding来解决这个问题。
解决方法是在控件模板中使用TemplateBinding来引用控件的属性值。具体步骤如下:
1. 在自定义控件的模板中,找到需要引用控件属性的元素。
2. 使用TemplateBinding来设置该元素的属性,将其绑定到控件的对应属性上。
3. 通过使用TemplateBinding,可以在模板中引用控件的属性,并将其值传递给需要设置的元素。
例如,假设有一个Button控件,它有一个默认的ControlTemplate属性和Height属性。我们想要自定义Button的ControlTemplate,并将其中的一个元素的属性设置为Button的Height属性。可以按照以下步骤来实现:
1. 创建一个新的控件模板,其中包含一个Ellipse元素。
2. 使用TemplateBinding来设置Ellipse的Height属性,将其绑定到Button的Height属性上。
3. 这样,当Button的Height属性发生变化时,Ellipse的Height属性也会相应地更新。
通过使用TemplateBinding,我们可以在控件模板中引用控件的属性,并将其值传递给需要设置的元素。这样,我们就可以实现自定义控件模板时,使用控件的属性来设置模板中元素的属性的需求。
模板绑定(TemplateBinding)用于绑定模板定义中的元素属性。在下面的例子中,可以这样写:
这里的意思是将边框的padding属性绑定到...什么呢?你可能想说,“绑定到正在使用此模板的控件的padding属性”。但是,你不能给它一个名称,因为此时你不知道控件的x:Name(即使知道了,也不起作用,因为它在不同的命名范围内)。然而,你可以通过定义相对源(RelativeSource)来实现:
或者使用模板绑定(TemplateBinding),这是上面方法的一种快捷方式:
除了在这些模板化场景中更简洁外,模板绑定(TemplateBinding)与常规绑定相比具有以下几点不同之处:
- 它在编译时进行评估(例如,如果Padding属性不存在,将会得到一个编译错误。但是如果使用带有TemplatedParent的绑定,你只能在运行时看到错误)。
- 它始终是单向绑定。
- 它要求源属性和目标属性都是依赖属性。
- 它的功能较少(没有StringFormat、Delay、IsAsync等等,可以参考Binding和TemplateBindingExtension的属性)。