これら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>
?
TemplateBindingはまったく同じものではありません。 MSDNドキュメントは、ソフトウェア機能について単音節のSDEをクイズしなければならない人々によって書かれていることが多いため、微妙なニュアンスは正しくありません。
TemplateBindingsは、コンパイル時にコントロールテンプレートで指定された型に対して評価されます。これにより、コンパイル済みテンプレートのインスタンス化がはるかに高速になります。テンプレートバインディングで名前を変更すると、コンパイラによってフラグが設定されることがわかります。
バインディングマークアップは実行時に解決されます。実行は遅くなりますが、バインディングは、テンプレートによって宣言された型で表示されないプロパティ名を解決します。遅くなると、バインディング操作はアプリケーションのCPUをほとんど使用しないため、そのような相対的なものを指摘します。コントロールテンプレートを高速でブラストしている場合は、それに気付くかもしれません。
実際問題として、バインディングを恐れることができるができない場合は、TemplateBindingを使用します。
TemplateBinding-通常のバインディングを使用するよりも制限が多い
通常バインディング-TemplateBindingの上記の制限はありません
もう1つ-TemplateBindingsは値の変換を許可しません。コンバーターを渡すことはできず、たとえばintを自動的に文字列に変換することもありません(これはバインディングでは通常です)。
TemplateBindingは、TemplatedParentを使用したBindingの省略形ですが、Bindingクラスのすべての機能を公開するわけではありません。たとえば、BindingBindingをTemplateBindingから制御することはできません。
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を利用できます
それらは同様の方法で使用されますが、いくつかの違いがあります。 TemplateBindingのドキュメントへのリンクは次のとおりです。 http://msdn.Microsoft.com/en-us/library/ms742882.aspx