WPF TemplateBinding与RelativeSource TemplatedParent

时间:2009-07-15 12:52:23

标签: wpf relativesource templatebinding

这两个绑定之间的差异是什么:

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

7 个答案:

答案 0 :(得分:198)

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

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

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

作为练习,尽可能使用TemplateBinding,但不要担心绑定。

答案 1 :(得分:32)

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

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

常规 Binding - 没有上述限制的TemplateBinding

  • 尊重家长属性
  • 重置目标值以清除任何明确设置的值
  • 示例:&lt; Ellipse Fill =“{Binding RelativeSource = {RelativeSource TemplatedParent},Path = Background}”/&gt;

答案 2 :(得分:19)

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

答案 3 :(得分:16)

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

答案 4 :(得分:3)

RelativeSource TemplatedParent

此模式允许将给定的ControlTemplate属性绑定到应用ControlTemplate的控件的属性。为了更好地理解这个问题,下面是一个例子

<Window.Resources>
    <ControlTemplate x:Key="template">
        <Canvas>
            <Canvas.RenderTransform>
                <RotateTransform Angle="20"/>
            </Canvas.RenderTransform>
            <Ellipse Height="100" Width="150" 
                     Fill="{Binding 
                RelativeSource={RelativeSource TemplatedParent},
                Path=Background}">

            </Ellipse>
            <ContentPresenter Margin="35" 
                      Content="{Binding RelativeSource={RelativeSource  
                      TemplatedParent},Path=Content}"/>
        </Canvas>
    </ControlTemplate>
</Window.Resources>

<Canvas Name="Parent0">
    <Button   Margin="50" 
              Template="{StaticResource template}" Height="0" 
              Canvas.Left="0" Canvas.Top="0" Width="0">
        <TextBlock FontSize="22">Click me</TextBlock>
    </Button>
</Canvas>

如果我想将给定控件的属性应用于其控件模板,那么我可以使用TemplatedParent模式。这个标记扩展也有类似的一个,它是TemplateBinding,它是第一个的简写,但TemplateBinding在编译时以TemplatedParent的对比度进行评估,TemplatedParent在第一个运行时之后进行评估。正如您在下图中所述,背景和内容从按钮内部应用到控件模板。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

它们以类似的方式使用,但它们有一些差异。 以下是TemplateBinding文档的链接: http://msdn.microsoft.com/en-us/library/ms742882.aspx