web-dev-qa-db-ja.com

WPF TemplateBindingとRelativeSource TemplatedParent

これら2つのバインディング間のdifferenceとは何ですか:

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

162
PaN1C_Showt1Me

TemplateBindingはまったく同じものではありません。 MSDNドキュメントは、ソフトウェア機能について単音節のSDEをクイズしなければならない人々によって書かれていることが多いため、微妙なニュアンスは正しくありません。

TemplateBindingsは、コンパイル時にコントロールテンプレートで指定された型に対して評価されます。これにより、コンパイル済みテンプレートのインスタンス化がはるかに高速になります。テンプレートバインディングで名前を変更すると、コンパイラによってフラグが設定されることがわかります。

バインディングマークアップは実行時に解決されます。実行は遅くなりますが、バインディングは、テンプレートによって宣言された型で表示されないプロパティ名を解決します。遅くなると、バインディング操作はアプリケーションのCPUをほとんど使用しないため、そのような相対的なものを指摘します。コントロールテンプレートを高速でブラストしている場合は、それに気付くかもしれません。

実際問題として、バインディングを恐れることができるができない場合は、TemplateBindingを使用します。

198

TemplateBinding-通常のバインディングを使用するよりも制限が多い

  • バインディングよりも効率的ですが、機能が少ない
  • ControlTemplateのビジュアルツリー内でのみ動作します
  • Freezablesのプロパティでは機能しません
  • ControlTemplateのトリガー内では機能しません
  • プロパティを設定する(冗長ではなく)ショートカットを提供します。 {TemplateBinding targetProperty}

通常バインディング-TemplateBindingの上記の制限はありません

  • 親のプロパティを尊重
  • ターゲット値をリセットして、明示的に設定された値をクリアします
  • 例:<Ellipse Fill = "{Binding RelativeSource = {RelativeSource TemplatedParent}、Path = Background}" />
32
Paul Fischer

もう1つ-TemplateBindingsは値の変換を許可しません。コンバーターを渡すことはできず、たとえばintを自動的に文字列に変換することもありません(これはバインディングでは通常です)。

19

TemplateBindingは、TemplatedParentを使用したBindingの省略形ですが、Bindingクラスのすべての機能を公開するわけではありません。たとえば、BindingBindingをTemplateBindingから制御することはできません。

16
Nir

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はFreezable型(ブラシオブジェクトを含む)をサポートしていないと思いました。問題を回避するために。 TemplatedParentを利用できます

1
Yaz

それらは同様の方法で使用されますが、いくつかの違いがあります。 TemplateBindingのドキュメントへのリンクは次のとおりです。 http://msdn.Microsoft.com/en-us/library/ms742882.aspx

0
David Rogers