WPF TemplateBinding与RelativeSource TemplatedParent

PaN*_*1Me 164 wpf relativesource templatebinding

这两个绑定有什么区别:

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

Gra*_*ath 200

TemplateBinding并不完全相同.MSDN文档通常由那些必须测试单音节SDE关于软件功能的人编写,因此细微差别并不完全正确.

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

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

作为一个实践,你可以使用TemplateBinding,但不要担心绑定.

  • 所以主要想要记住:编译时间与运行时间.如果在运行时尝试更改,则TemplateBinding将不起作用.对 ? (18认同)
  • 另请注意,使用Binding而不是TemplateBinding可能会影响您在设计时看到的内容.在某些配置中,使用{Binding RelativeSource ...}绑定的属性不会出现在设计器中(尽管它们仍会在运行时显示),但如果切换到使用{TemplateBinding ...},则会评估这些属性在设计时间. (3认同)

小智 32

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

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

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

  • 尊重父级属性
  • 重置目标值以清除任何明确设置的值
  • 示例:<Ellipse Fill ="{Binding RelativeSource = {RelativeSource TemplatedParent},Path = Background}"/>


Mir*_*kov 19

还有一件事 - TemplateBindings不允许进行价值转换.它们不允许您传递转换器,并且不会自动将int转换为字符串(例如,绑定是正常的).


Nir*_*Nir 17

TemplateBinding是使用TemplatedParent绑定的简写,但它不公开Binding类的所有功能,例如,您无法从TemplateBinding控制Binding.Mode.