WPF TemplateBinding 与 RelativeSource TemplateParent

这两个绑定之间的 不同是什么:

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

111433 次浏览

它们的使用方式相似,但有一些不同之处。 下面是 TemplateBinding 文档的链接: Http://msdn.microsoft.com/en-us/library/ms742882.aspx

TemplateBinding 是 Binding with TemplatedParent 的简写,但它不公开 Binding 类的所有功能,例如,您不能控制 Binding。来自 TemplateBinding 的模式。

TemplateBinding 并不完全是一回事。MSDN 文档通常是由那些必须对单音节 SDE 进行软件特性测试的人编写的,所以细微差别并不完全正确。

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

绑定标记在运行时解析。虽然执行速度较慢,但绑定将解析在模板声明的类型上不可见的属性名。由于绑定操作对应用程序的 CPU 占用很少,所以我会慢慢地指出它的相对性。如果您正在高速运行控件模板,您可能会注意到它。

作为一个实践的问题,使用 TemplateBinding 时,您可以但不要害怕绑定。

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

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

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

  • 比 Binding 更有效,但功能性较差
  • 只能在 ControlTemplate 的可视化树中工作
  • 不适用于 Freezables 的属性
  • 在 ControlTemplate 的触发器中无法工作
  • 提供设置属性(不详细)的快捷方式,例如{ TemplateBindingtargetProperty }

常规 译自: 美国《科学》杂志网站(http://msdn.microsoft.com/en-us/library/system.windows.data.Binding.aspx)-不具有以上模板绑定的限制

  • 尊重父母财产
  • 重置目标值以清除任何显式设置的值
  • 示例: < 椭圆填充 = “{ Binding RelativeSource = { RelativeSource TemplatedParent } ,路径 = 背景}”/>