2013年4月9日火曜日

ビヘイビアを使ってみる

ビヘイビアを使わないといけない局面が多そうなので、ビヘイビアの実装を試しました

今回のビヘイビアは、
- ボタンを押すとメッセージボックスを表示する
というものです
要件としてはMVVMのデータバインドでも実行できるものですが、
今回はデータバインドをかけていない"ビヘイビア"から実行します

データバインドは、"DataContext = view ViewModel()"とすることで
紐づけられていましたが、今回は"DependencyProperty"で紐づけ
を行うようです

要点は
Behavior側のコード
- クラスを作成
  public class TestBehavior : Behavior<Button>
  ボタン型に対するBeheviorを継承したクラス
- DependencyPropertyの定義
        public string Message
        {
            get { return (string)GetValue(MessageProperty); }
            set { SetValue(MessageProperty, value); }
        }
- DependencyPropertyの登録
  DependencyProperty.Register("プロパティ名", typeof(プロパティ型), typeof(所有者型));
   今回は
     プロパティ型 : stringになります
     所有者型 :  クラス名
- attach / detachの実装 > += / -= でイベントの追加をしている
 "AssociatedObject"とは、コントロール対象のオブジェクト(この場合はボタン)
     protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.Click += Alert;  // クリックイベントでAlert()を実行
        }
     protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.Click -= Alert;
        }
- イベント時に実行するハンドラの記載(↑で += されるもの)
        private void Alert(object sender, EventArgs e)
        {
            if(!string.IsNullOrEmpty(this.Message)){
                MessageBox.Show(this.Message); // メッセージボックスを表示するだけ
            }
        }

View側
- namespaceにinteractivity追加
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

- Bhaviorを追加
            <Button Content="Button" HorizontalAlignment="Left" Margin="8,8,0,0" VerticalAlignment="Top" Width="75">
                <i:Interaction.Behaviors>
                    <local:TestBehavior Message="メッセージを渡す"/>
                </i:Interaction.Behaviors>

            </Button>

最後の
<local:TestBehavior Message="メッセージを渡す"/>
で、メッセージを渡すビヘイビアを実行しています


<Window x:Class="BehaviorTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
       
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:local="clr-namespace:BehaviorTest"
        >
    <!-- 上記Title以下の2行追加 -->
    <Grid>
        <StackPanel>
            <Button Content="Button" HorizontalAlignment="Left" Margin="8,8,0,0" VerticalAlignment="Top" Width="75">
                <i:Interaction.Behaviors>
                    <local:TestBehavior Message="メッセージを渡す"/>
                </i:Interaction.Behaviors>
            </Button>
        </StackPanel>
    </Grid>
   
</Window>


---- ビヘイビア側
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Windows.Interactivity;         // 追加
using Microsoft.Expression.Interactivity;   // 追加

using System.Windows.Controls;      // コントロール名称を参照する為
using System.Windows;               // DependencyPropertyの定義

using System.Diagnostics;

namespace BehaviorTest
{
    public class TestBehavior : Behavior<Button>
    {
        // 依存関係プロパティの登録
        public static readonly DependencyProperty MessageProperty =
            DependencyProperty.Register("Message", typeof(string), typeof(TestBehavior),
                                        new UIPropertyMetadata(null));

        // 登録される依存関係プロパティ
        public string Message
        {
            get { return (string)GetValue(MessageProperty); }
            set { SetValue(MessageProperty, value); }
        }
       
        /// <summary>
        /// アクションハンドラの記載
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Alert(object sender, EventArgs e)
        {
            if(!string.IsNullOrEmpty(this.Message)){
                MessageBox.Show(this.Message);
            }
        }

        /// <summary>
        /// アタッチされた時の処理
        /// </summary>
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.Click += Alert;
        }

        /// <summary>
        /// デタッチされた時の処理
        /// </summary>
        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.Click -= Alert;
        }
    }
}



0 件のコメント:

コメントを投稿