173

这两个绑定有什么区别:

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

?

4

6 回答 6

211

TemplateBinding 并不完全相同。MSDN 文档通常由必须对单音节 SDE 进行软件功能测试的人编写,因此细微差别不太正确。

TemplateBindings 在编译时根据控件模板中指定的类型进行评估。这允许更快地实例化已编译的模板。只需在模板绑定中摸索名称,您就会看到编译器会标记它。

绑定标记在运行时解析。虽然执行速度较慢,但​​绑定将解析在模板声明的类型上不可见的属性名称。慢一点,我会指出它是相对的,因为绑定操作占用应用程序的 CPU 很少。如果您正在高速爆破控制模板,您可能会注意到它。

在实践中,尽可能使用 TemplateBinding,但不要害怕 Binding。

于 2009-12-01T01:52:30.467 回答
37

TemplateBinding - 比使用常规绑定更具限制性

  • 比绑定更高效,但功能更少
  • 仅适用于 ControlTemplate 的可视化树中
  • 不适用于 Freezables 上的属性
  • 在 ControlTemplate 的触发器中不起作用
  • 提供设置属性的快捷方式(不是冗长的),例如 {TemplateBinding targetProperty}

常规绑定- 没有 TemplateBinding 的上述限制

  • 尊重父属性
  • 重置目标值以清除任何明确设置的值
  • 示例:<Ellipse Fill="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Background}"/>
于 2012-02-27T05:47:52.340 回答
23

还有一件事 - TemplateBindings 不允许值转换。例如,它们不允许您传递 Converter 并且不会自动将 int 转换为字符串(这对于 Binding 来说是正常的)。

于 2011-05-24T16:39:44.673 回答
17

TemplateBinding 是 Binding with TemplatedParent 的简写,但它并未公开 Binding 类的所有功能,例如,您无法从 TemplateBinding 控制 Binding.Mode。

于 2009-07-15T19:16:38.140 回答
1

我认为 TemplateBinding 不支持 Freezable 类型(包括画笔对象)。为了解决问题。可以使用 TemplatedParent

于 2010-01-20T14:41:28.670 回答
0

它们的使用方式相似,但有一些区别。这是 TemplateBinding 文档的链接:http: //msdn.microsoft.com/en-us/library/ms742882.aspx

于 2009-07-15T15:56:25.393 回答