VB のたまご

作成日: 2017/03/20, 更新日: 2017/03/20



ビヘイビア

  •  (※もし、直接このページにたどり着いた方は、以前投稿した Livetアプリケーション作成時の注意 を読んで、 名前空間やプロジェクト追加に気を付ける必要があることを知ってください)

  • スポンサーリンク


  •  ビヘイビアは、何のイベントを使うか、どういう処理をおこなうか決まっている場合に使います。 それではよく分からなくていいので、サンプルを見てみましょう。 以下では、「Livet WPF4.5 MVVM アプリケーション」で作成しています。

  •  このサンプルでは、ビヘイビアのソースは、「Behaviors」フォルダを作成してその中に作成しました。 ビヘイビア専用テンプレートファイルは無いため、「クラス」を作成して以下を書きます。

  • Imports System.Windows.Interactivity
    
    Namespace Behaviors
    
        ' Button に機能をアタッチ(取り付け)、デタッチ(取り外し)
        ' Click イベントにより、メッセージ表示する
        ' 継承時に任意の型を指定することで、継承元メンバーの AssociatedObject の型が決まる
        ' AssociatedObject を指定のコントロールと見立てて操作する
        ' Associate(アソシエイト) は「関連した、結びついた」というような意味合い
        Public Class ButtonClickBehavior
            Inherits Behavior(Of Button)
    
            ' Button にアタッチしたときの処理(イベント登録)
            Protected Overrides Sub OnAttached()
                MyBase.OnAttached()
    
                AddHandler Me.AssociatedObject.Click, AddressOf Me.Button_Click
    
            End Sub
    
            ' Button からデタッチしたときの処理(イベント解除)
            Protected Overrides Sub OnDetaching()
    
                RemoveHandler Me.AssociatedObject.Click, AddressOf Me.Button_Click
    
                MyBase.OnDetaching()
            End Sub
    
            ' クリックしたときにおこないたい処理を用意
            Private Sub Button_Click(sender As Object, e As EventArgs)
    
                Console.WriteLine("Hello, Behavior!")
    
            End Sub
    
        End Class
    End Namespace
    

  •  Behavior (ビヘイビア)は「振る舞い、動作」という意味合いがあります。 ビヘイビアは、System.Windows.Interactivity 名前空間にある Behavior(Of T) クラスを継承して作成します。 すでに「System.Windows.Interactivity.dll」が参照設定で追加してあるので、すぐに使うことができます。

  • スポンサーリンク


  •  ビヘイビアは「後から機能を追加する、くっつける」という扱いになりますので、ビヘイビアをコントロールに「くっつける、取り付ける」時の処理と、 ビヘイビアをコントロールから「取り外す」時の処理と、実際におこないたい処理を書きます。

  •  このサンプルでは、振る舞いはクリックイベントを利用して、文字列を出力する振る舞いになっています。 「取り付け」と「取り外し」に該当するのが、それぞれ「OnAttached」メソッドと「OnDetaching」メソッドです。 基本的に、ここには、「コントロールのイベント」と、「対応するイベントハンドラ」を追加、または解除する処理を書きます。 ここではクリックイベントを追加、または解除しています。イベントハンドラ内の処理は、そのままです。

  •  次に、このビヘイビアを使ってみましょう。以下はそのサンプルです。

  • <Window x:Class="Views.BehaviorWindow1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
            xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
            xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
            xmlns:v="clr-namespace:w09_Interactions.Views"
            xmlns:vm="clr-namespace:w09_Interactions.ViewModels"
            xmlns:b="clr-namespace:w09_Interactions.Behaviors"
            Title="BehaviorWindow1" Height="350" Width="525">
        
         <i:Interaction.Triggers>
         
            <!--WindowのContentRenderedイベントのタイミングでViewModelのInitializeメソッドが呼ばれます-->
            <i:EventTrigger EventName="ContentRendered">
                <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Initialize"/>
            </i:EventTrigger>
    
            <!--Windowが閉じたタイミングでViewModelのDisposeメソッドが呼ばれます-->
            <i:EventTrigger EventName="Closed">
                <l:DataContextDisposeAction/>
            </i:EventTrigger>
    
        </i:Interaction.Triggers>
    
        <StackPanel Margin="10">
    
            <Button Content="ビヘイビアのテスト">
                <i:Interaction.Behaviors>
                    <b:ButtonClickBehavior />
                </i:Interaction.Behaviors>
            </Button>
    
        </StackPanel>
        
    </Window>
    

  •  Window.DataContext プロパティに、ViewModels の BehaviorWindow1ViewModel をセットするように記載されていますが、 ここでは、バインドしたいデータは無いので(ビューモデルは不要なので)、このタグ一式をコメントアウト、または削除してしまいます。 こうすると、BehaviorWindow1ViewModel.vb を作成せずともビルドを通すことができます。

  •  Window タグ内の名前空間定義の中に「xmlns:b="clr-namespace:w09_Interactions.Behaviors"」と追記しました。 ViewModels の1行をコピペして、フォルダ名に該当する名前空間だけ Behaviors に変更したものです。 プレフィックス(接頭辞、v や vm の部分)は何でもいいですが、ここでは「b」としています。 Button タグの下に、Interaction.Behaviors タグを書いて、この中に作成したビヘイビアを書きます。

  •  できたら実行して、ボタンを押してみてください。文字列が出力されたら OK です。