ビヘイビアを使わないといけない局面が多そうなので、ビヘイビアの実装を試しました
今回のビヘイビアは、
- ボタンを押すとメッセージボックスを表示する
というものです
要件としては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 件のコメント:
コメントを投稿