【问题标题】:What is the template binding vs binding?什么是模板绑定与绑定?
【发布时间】:2012-05-15 09:08:07
【问题描述】:

我听不懂BorderThickness="{TemplateBinding BorderThickness}。 代码如下:

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

还请说明其他类型的绑定。

【问题讨论】:

  • 为什么返回以及为什么 BorderThickness 写两次 """BorderThickness="{TemplateBinding BorderThickness}"""
  • @Euphoric 这个页面似乎是该查询的第一个谷歌结果。 ;)

标签: wpf mvvm-light


【解决方案1】:

TemplateBinding 用于绑定到模板定义中的元素属性。在您的示例中,您可以编写:

 <Border Padding="{Binding Padding}" ...>

...意思是将边框的 padding 属性绑定到...的 padding 属性 什么? 你想说,“这个模板用于的控件的 padding 属性。”你不能给它一个名字,因为你现在不知道控件的 x:Name(即使你知道了,它也不起作用,因为它在不同的名称范围内)。但是,您可以通过定义相对源来做到这一点

<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

或使用 TemplateBinding,这是上面的快捷方式(*)

<Border Padding="{TemplateBinding Padding}" ...>

(*) 除了在这些模板场景中不那么冗长之外,TemplateBinding 与常规绑定相比还有一些不同之处:

  • 它在编译时进行评估。 (例如,如果 Padding 属性不存在,您会收到编译错误。但如果您使用 TemplatedParent 绑定,您只会在运行时看到错误。)
  • 它始终是一种单向绑定。
  • 它要求源属性和目标属性都是依赖属性。
  • 它的功能要少得多(没有 StringFormat、Delay、IsAsync 等。请参阅 Binding 与 TemplateBindingExtention 的属性)。

【讨论】:

    【解决方案2】:

    一张图片胜过一千个字。本例为 7 分钟视频:https://www.youtube.com/watch?v=z-0TZR-7xLI

    编辑: 示例:

    • Button 具有默认的 ControlTemplate 属性和 Height 属性
    • 您可以通过编写自己的方式覆盖Button 的ControlTemplate 属性(例如,您想创建一个Ellipse-looking 按钮而不是Rectangle-looking)
    • 在新的ControlTemplate 中创建Ellipse 后,您希望Ellipse 与原始Button 的Height 属性大小相同
    • 所以您使用TemplateBinding 来引用Button 的Height 而不命名它

    【讨论】:

    • 这张照片很有帮助。谢谢!
    【解决方案3】:

    Eren Ersönmenz 已经很好地解释了它,但我想给它另一个视角以更好地理解这个概念。

    在 WPF 中,每个控件都或多或少地与其表示分离。您可以随时更改控件模板并使其看起来完全不同。例如,一个按钮按预期工作,ControlTemplate 仅由 Rectangle 组成。现在有时需要ControlTemplate 实际使用控件逻辑部分的属性。这就是TemplateBinding 的意义所在,它只是告诉ControlTemplate“使用我们正在提供视觉呈现的控件的这个属性”。 一个很好的例子是每个控件上的Background 属性,它本身没有任何意义,它通过TemplateBinding 将其含义传递给ControlTemplate 中的子控件。

    绑定本身在MSDN 中有很好的描述。 This 是一个非常好的备忘单,它实际上挂在我旁边的墙上。它很好地概述了所有可用的不同绑定。

    【讨论】:

      【解决方案4】:

      从TemplateBinding Markup Extension 开始,TemplateBinding 将控件模板中的属性值链接到模板化控件上的某些其他公开属性的值。换句话说,它用于在模板中绑定值。

      Binding 连接绑定目标和数据源的属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-21
        • 2019-12-17
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        • 1970-01-01
        相关资源
        最近更新 更多