1. ホーム
  2. wpf

[解決済み] WPF TemplateBindingとRelativeSource TemplatedParentの比較

2022-04-22 05:01:51

質問

とは何ですか? この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を使えるときは使い、Bindingを怖がらないようにしましょう。