コンポーネントのラインナップTemplateBinding vs RelativeSource TemplatedParent
-
16-09-2019 - |
質問
何 差 これら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ドキュメントは、多くの場合、ソフトウェアの機能についての単音節のSDEをクイズしなければならない人々によって書かれ、そのニュアンスはかなり右ではありませんされます。
TemplateBindingsは、コントロールテンプレートで指定された型に対してコンパイル時に評価されます。これは、コンパイルされたテンプレートのはるかに高速インスタンス化することができます。ただ、TemplateBindingの中で名前を手探りし、あなたはそのコンパイラの意志フラグそれが表示されます。
バインディングのマークアップは、実行時に解決されます。遅く実行する一方で、結合は、テンプレートによって宣言された型の上に表示されていないプロパティ名を解決します。遅くすることで、私は相対的なのは、その種が結合操作は、アプリケーションのCPUの非常に少ないがかかるためと指摘します。あなたは高速で周りのコントロールテンプレートを爆破していた場合、あなたはそれに気づくかもしれません。
実際の問題として、あなたがたが結合するのを恐れていないことができたときます。
TemplateBindingのを使用他のヒント
TemplateBinding -より制限より通常の結合
- より効率的で拘束力のあるものも少な機能
- のみの作品の中にControlTemplateビューツリー
- になりません特性Freezables
- な内ControlTemplateのトリガー
- 提供するショートカット設定の性質などの詳細など{TemplateBinding targetProperty}
通常の 結合 -いません上記の制限TemplateBinding
- を尊重し、親性
- リセットの目標値をクリアは明示的に設定値
- 例:<Ellipse Fill="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Background}" />
もう一つ - TemplateBindingsは、値が変換はできません。彼らはあなたがコンバータを渡すことはできませんし、自動的に(結合のために正常です)たとえば、文字列にint型に変換しません。
TemplateBindingのはTemplatedParentとの結合のための省略形ですが、それはあなたがTemplateBindingのからBinding.Modeを制御することはできません例えば、Bindingクラスのすべての機能を公開しません。
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モードを使用することができます。そこ最初の1の短い手の一種であるTemplateBindingのである。このマークアップ拡張機能と同様のものもあるが、TemplateBindingのは、単に最初の実行時間後に評価されTemplatedParentのコントラストで、コンパイル時に評価されます。あなたが怒鳴る図に発言できるように、背景と内容はコントロールテンプレートにボタンの中から適用されます。
私はTemplateBindingのは、(ブラシオブジェクトを含む)Freezableのタイプをサポートしていないと思いました。問題を回避するには。一つはTemplatedParentを利用することができます。
彼らは同様の方法で使用されているが、彼らはいくつかの相違点があります。 ここでTemplateBindingのドキュメントへのリンクは次のとおりです。 http://msdn.microsoft.com/en-us/library/ms742882。 ASPXする