什么是的 这些2绑定:

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

?

有帮助吗?

解决方案

TemplateBinding是不太一样的东西。 MSDN文档通常是由具有考考您对软件功能的单音节随机微分方程人写的,所以细微之处不完全正确。

TemplateBindings在针对在控制模板中指定的类型编译时被评估。这允许编译模板更快实例。只是在一个摸索templatebinding的名字,你会看到,编译器会对其进行标记。

的结合标记是在运行时解决。而较慢的执行,绑定将解决不可见由模板声明的类型属性名称。通过比较慢,我会指出,它的种类,因为绑定操作相对需要很少的应用程序的CPU的。如果你在高速各地爆破控制模板,你可能会注意到它。

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

其他提示

TemplateBinding -更多的限制,比使用经常结合

  • 比效率更高的结合,但它有更少的功能
  • 只适用内部控件的视觉树
  • 不会的工作性质上Freezables
  • 不会的工作范围内的一个控件的触发
  • 提供了一个快捷方式设定的性质(不作详细的),例如{TemplateBinding targetProperty}

定期 结合 -没有上述限制的TemplateBinding

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

还有一两件事 - TemplateBindings不允许值转换。它们不允许你通过一个转换器,并且不自动转换的int字符串例如(这是正常的绑定)。

TemplateBinding是用于与TemplatedParent绑定的简写,但它不暴露Binding类的所有功能,例如,你不能从TemplateBinding控制Binding.Mode。

的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的对比评估。正如可以在图中波纹管此话,背景和内容,从该按钮将控制模板内应用。

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

他们以同样的方式使用,但他们有一些区别。 下面是对TemplateBinding文档的链接: http://msdn.microsoft.com/en-us/library/ms742882。 ASPX

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top