2009-07-15 16 views
153
は、これらの2つのバインディング間 違いは何ですか

WPF TemplateBindingの

+15

2ウェイバインディングが必要な場合は、2番目のオプションを使用する必要があります –

答えて

195

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

テンプレートバインディングは、コンパイル時にコントロールテンプレートで指定された型に対して評価されます。これにより、コンパイルされたテンプレートをより迅速にインスタンス化できます。テンプレートバインディングでその名前をあいまいにして、コンパイラがそれにフラグを立てることがわかります。

バインディングマークアップは実行時に解決されます。実行が遅くなると、バインディングはテンプレートによって宣言された型では見えないプロパティ名を解決します。遅くなるにつれて、私はバインディング操作がアプリケーションのCPUのほんのわずかしかかからないので、その種の相対的なものを指摘します。コントロールテンプレートを高速で吹き飛ばしていた場合は、気づくかもしれません。

Bindingを恐れることはできませんが、実際にはTemplateBindingを使用してください。

+17

したがって、メインは覚えていると思います。コンパイル時間とランタイム。ランタイム中に変更しようとすると、TemplateBindingは機能しません。右 ? –

+2

また、TemplateBindingではなくBindingを使用すると、デザイン時に表示される内容に影響を与えることにも注意してください。特定の構成では、{Binding RelativeSource ...}を使用してバインドされたプロパティはデザイナに表示されません(ただし、実行時には表示されます)。{TemplateBinding ...}を使用すると、設計時に – lfalin

15

TemplateBindingのはTemplatedParentとの結合のための省略形ですが、それはあなたがTemplateBindingのからBinding.Modeを制御することはできません例えば、Bindingクラスのすべての機能を公開しません。

1

私はTemplateBindingがFreezableタイプ(ブラシオブジェクトを含む)をサポートしていないと考えました。問題を回避する。 TemplatedParentを使用することができます

18

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

+1

ありがとうMiroslav、これは私が遭遇していた問題で、TemplatedParentを使用して問題を解決しました。 – MikeKulls

27

TemplateBindingから

  • は、上のプロパティでは動作しません、通常の使用
  • のみのControlTemplateのビジュアルツリー内で動作しますバインディングが、それが持っている機能は少ないより

    • より効率的な結合よりも制限よりFreezables
    • ControlTemplateのトリガー内では機能しません
    • settinでショートカットを提供しますgプロパティ(冗長ではない)、例えば、{TemplateBindingのtargetProperty}

    正規Binding - TemplateBindingのを制限

    • 尊重する親プロパティ
    • リセット目標値いかなる明示的に設定された値
    • 例をクリアするために、上記の必要はありません。<楕円形の塗りつぶし= "{バインディングRelativeSource = {RelativeSource TemplatedParent}、パス=背景}"/>
  • 2

    RelativeSource TemplatedParent

    このモードでのControlTemplateが適用される制御の性質に与えられたのControlTemplateプロパティを結ぶ可能。ここにも問題を理解するために、私はそのコントロールテンプレートに与えられたコントロールのプロパティを適用したい場合は、私はTemplatedParentモードを使用することができます

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

    怒鳴る例です。このマークアップ拡張にも同様のものがあります。これは、最初の短い手の一種であるTemplateBindingですが、TemplateBindingは、最初の実行時間の直後に評価されるTemplatedParentのコントラストでコンパイル時に評価されます。以下の図から分かるように、背景とコンテンツはボタン内からコントロールテンプレートに適用されます。

    関連する問題