自作ビヘイビアを作ろう

Blend4でプログラミングできる部品として使うビヘイビア。組込みのものを使うのは勿論良いのだが、作るのが非常に簡単なので自分の欲しいビヘイビアを思いついたらばんばん作って良いと思う。

以下、ビヘイビアを作る手順。

System.Windows.Interactivity.Behaviorクラスの継承クラスを作る

Behaviorクラスは型情報を取るジェネリクスクラスなので、このビヘイビアが接続を前提とするオブジェクト(AssociatedObject)の型を指定して、それを拡張したクラスを用意する。
オーバーライドするメソッドは、ビヘイビアーが関係するオブジェクト(AssociatedObject)に接続された際に呼ばれるOnAttachedメソッドと切断された際に呼ばれるOnDetachingメソッドのたった二つだけである。 素晴らしい。

例としてTextBoxのテキストが変更されたならばバインドされているデータソースを更新するビヘイビアを書いてみる。

UpdateSourceOnTextChangedBehaviorクラス
    public class UpdateSourceOnTextChangedBehavior : Behavior<TextBox>
    {
        private readonly TextChangedEventHandler _textChangedEventHandler = 
            (s, e) =>
            {
                var t = s as TextBox;
                // イベントハンドラ内でSourceの更新を行う 
                var binding = t.GetBindingExpression(TextBox.TextProperty);
                if (binding != null)
                {
                    binding.UpdateSource();
                }
            };

        protected override void OnAttached()
        {
            // 接続のタイミングでイベントを登録
            base.OnAttached();
            AssociatedObject.TextChanged += _textChangedEventHandler;
        }
        protected override void OnDetaching()
        {
            // 切り離されるタイミングでイベントの登録解除 
            AssociatedObject.TextChanged -= _textChangedEventHandler;
            base.OnDetaching();
        } 
    }

ビヘイビアクラスのクラス名にはサフィクス"Behavior"を付加するのが良いだろう。
コントロールを関係オブジェクトとして使うビヘイビアを作る場合、このようにビヘイビアのAttach/Detch時になんらかのイベントに接続/切断するケースが多いと思われる。

作ったビヘイビアをBlend4で使う

コンパイル、テストの済んだビヘイビアはBlend4でプロジェクト>アセットを介して参照することが出来るので、すぐに使うことができる。

この例ではtextBox1に作ったビヘイビアをアタッチしている。これで、以降textBox1に入力された文字列が変化した場合にバインドソース(恐らくはViewModelのプロパティ)が更新されるだろう。

また、この時のXAMLは以下のようになる。

このXAMLを意識する必要は殆どないだろう。

このようにビヘイビアを作るのは従来の関係コントロールを開発するのに比べてずっと簡単だ。
また、ビヘイビアの良い所はそれを追加、削除した所で通常我々が見ているソースコードを一切書き換えないことである。GUI-ソースコード連動型のツールではこうはいかない。