WPF TemplateBinding与RelativeSource TemplatedParent


169

是什么 两个绑定之间有区别

<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>


17
如果您需要双向绑定,则必须使用第二个选项
Joachim Kerschbaumer 2011年

Answers:


207

TemplateBinding不太一样。MSDN文档通常由必须编写有关软件功能的单音节SDE的人编写,因此细微差别不太正确。

在编译时,对照控件模板中指定的类型评估TemplateBindings。这样可以更快地实例化已编译的模板。只要在模板绑定中弄乱名称,您就会看到编译器会对其进行标记。

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

作为实践,在可以但不担心绑定的情况下使用TemplateBinding。


18
因此要记住的主要思想是:编译时间与运行时间。如果您尝试在运行时进行更改,则TemplateBinding将不起作用。对 ?
PaN1C_Showt1Me 2010年

3
还要注意,使用绑定而不是TemplateBinding可能会影响您在设计时看到的内容。在某些配置中,使用{Binding RelativeSource ...}绑定的属性将不会显示在设计器中(尽管它们仍会在运行时显示),但是如果切换到使用{TemplateBinding ...},则会对这些属性进行评估在设计时。
lfalin 2014年

如果要对将来的访问者有所帮助,我将添加一件事是,因为TemplateBinding是在编译时评估的,因此您不能使用TemplateBinding绑定到用户定义的附加属性。对于用户定义的附加属性,必须使用“ {Binding RelativeSource = {RelativeSource TemplatedParent} ...}”
MNB

35

TemplateBinding-比使用常规绑定有更多限制

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

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

  • 尊重父母的财产
  • 重置目标值以清除任何明确设置的值
  • 示例:<Ellipse Fill =“ {Binding RelativeSource = {RelativeSource TemplatedParent},Path = Background}” />


17

TemplateBinding是使用TemplatedParent进行绑定的简写,但是它没有提供Binding类的所有功能,例如,您无法通过TemplateBinding控制Binding.Mode。


1

我以为TemplateBinding不支持Freezable类型(包括笔刷对象)。为了解决这个问题。一个可以利用TemplatedParent


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.