【问题标题】:WPF TemplateBinding vs RelativeSource TemplatedParentWPF TemplateBinding 与 RelativeSource TemplatedParent
【发布时间】:2009-07-15 12:52:23
【问题描述】:

这两种绑定有什么区别

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

?

【问题讨论】:

  • 如果你需要双向绑定,你必须使用第二个选项

标签: wpf relativesource templatebinding


【解决方案1】:

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

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

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

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

【讨论】:

  • 所以要记住的主要思想:编译时间与运行时间。如果您尝试在运行时更改 TemplateBinding,它将无法工作。对吗?
  • 另请注意,使用 Binding 而不是 TemplateBinding 可能会对您在设计时看到的内容产生影响。在某些配置中,使用 {Binding RelativeSource...} 绑定的属性不会出现在设计器中(尽管它们仍会在运行时显示),但如果您切换到使用 {TemplateBinding...} 这些属性将被评估在设计期间。
  • 如果它对未来的访问者有帮助,我要补充一点,因为 TemplateBinding 是在编译时评估的,所以您不能使用 TemplateBinding 绑定到用户定义的附加属性。对于用户定义的附加属性,您必须使用“{Binding RelativeSource={RelativeSource TemplatedParent} ... }”
【解决方案2】:

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

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

Regular Binding - 没有以上 TemplateBinding 的限制

  • 尊重父属性
  • 重置目标值以清除任何明确设置的值
  • 示例:

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 感谢 Miroslav,这是我遇到的问题,改用 TemplatedParent 解决了问题。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-15
          • 1970-01-01
          • 1970-01-01
          • 2011-07-01
          • 1970-01-01
          • 2011-06-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多