ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

ビヘイビアの書きかたを見て、いったいどんだけコードビハインド書かせたくないんだよWPFって思った

behavior
音節be・hav・ior 発音記号/bɪhéɪvjɚ, bə‐|‐vjə/
【名詞】【不可算名詞】
1ふるまい,態度; 行動,挙動; 行儀,素行 《★【類語】 ⇒conduct》.
用例
her behavior toward me 彼女の私に対する態度.
2a【心理】 (生物の)行動; (生物の)習性.
b(機械などの)運転,動き.
c(特定の状態における物体・物質の示す)性質,作用,反応.

behaviorの意味 - 英和辞典 Weblio辞書

今まで書いてみたいなーと思ってなかなか書けなかったWPFのビヘイビア。少し簡単なものを書いてみると、「ビューからイベント処理のコードを隔離するためのもの」といった感じのものだと思いました。

まずはざっくり書き方の確認

オリジナルのビヘイビアはSystem.Windows.Interactivity.Behaviorから継承して書きます。Blendのライブラリが必要なので見当たらない場合は参照に追加します。
Tはビヘイビアを追加したいコントロールのクラスを入れます。
そのあとはOnAttachedとOnDetachingをオーバーライドして、AssociatedObjectにイベントハンドラーを登録/解除するコードを書きます。とりあえずクリックしたらメッセージボックスを出すだけの簡単なビヘイビアは以下のようになります。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;

namespace Sample.Views.Behaviors
{
    class AlertBehavior : Behavior<Button>
    {

        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.Click += Alert;
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.Click -= this.Alert;
        }

        private void Alert(object sender, MouseEventArgs e)
        {
            MessageBok.Show("ねむい!");
        }
    }
}

あとは必要に合わせて依存プロパティを追加したりハンドルするイベントを追加したりすればいいでしょう。

ビューで使うには

上のビヘイビアをさっそく使ってみましょう。

<!--
  ルート要素に次の属性を追加
  xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
  xmlns:b="clr-namespace:Sample.Views.Behaviors"
-->
<Button>
    <i:Interaction.Behaviors>
        <b:AlertBehavior />
    </i:Interaction.Behaviors>
</Button>

これでコードビハインドを書かずに、クリックしたらアラートが出るボタンが出来上がります。