Ktouth Brand. on Web

け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト



[2013年07月19日]

独自の添付プロパティへのバインディングをコードビハインドで記述する方法

2013年07月19日 21:24更新 筆者:K.Ktouth

WPF の特徴の一つであるプロパティのバインディングシステム、そして添付プロパティ。既存のものを使う分には特に困ることは無かったんですが、今回は「(自分の書いた)独自の名前空間にあるクラスの添付プロパティを使ったプロパティパス」を「コードビハインド」で記述するという幾つものハードルがあってなかなかに苦労しました。
結局情報が無かったんで、一旦XAMLで書いてデバッガでバインディングされた内容をインスペクタでチェックするという面倒くさいことをするハメに(笑)

次はこんな事をしないで済むように自分メモです。

(以下、コーディングの詳細)

XAMLではこう書く時...

まず、XAMLで記述する場合はかなりシンプルに記述可能です。

<Window ....
  xmlns:kt="http://www.k-brand.gr.jp/xmlns/WPF/4.5">
  <TextBlock ToolTip="{Binding Path=(kt:TrimPath.Source).SourcePath, RelativeSource={RelativeSource Self}}">
    <kt:TrimPath.Source>
      <kt:TrimPath SourcePath="{Binding DirectoryFooBar}" />
    </kt:TrimPath.Source>
  </TextBlock>
</Window>

上記コードの赤字の部分がバインディングのパス文字列です。ここで大事なのは、パス文字列の中に「独自の名前空間のプレフィックスが付いている」事で、これをコードでどう表現するかがキモになります。

で、どう書くか……?

C# ではこう書く。

各名前空間には using を通してあるという前提で……

var textBlock = ... // ここで対象となるテキストブロック要素を取得する
var path = new PropertyPath("(0).SourcePath", TrimPath.SourceProperty); // パス文字列を生成
textBlock.SetBinding(FrameworkElement.ToolTipProperty, new Binding() { Path = path, RelativeSource = RelativeSource.Self });

パス文字列を作る方法は上記の2行目。名前空間を指定するのではなく、該当する添付プロパティをプロパティ情報でまかなうという……言われてみればそれ以外に方法は無いよねと言うシンプルな方法で行います。この時の引数の挿入位置を指定する方法は String.Format の書式構文とは違うので注意!

本日のリンク元
アンテナ
その他のリンク元
検索