VB のたまご

作成日: 2017/04/07, 更新日: 2017/04/07



LivetCallMethodAction

  •  ここでは、トリガーアクションである LivetCallMethodAction について学習します。 通常、振る舞いを用意するには、コマンドを作成してバインドして使いますが、コマンドは実行したいメソッドを包んでいるだけであることが分かります。

  •  ということは、わざわざコマンド経由でメソッドを呼び出すのではなく、直接メソッドをバインドして呼び出した方が分かりやすいですよね。 それを実現させたのが LivetCallMethodAction です。

  • 以下のサンプルを見てみましょう。このサンプルでは、「Livet WPF4.5 MVVM アプリケーション」より作成したもので、ViewModel と View を作成しています。

  • Namespace ViewModels
        Public Class LivetCallMethodActionWindow1ViewModel
            Inherits ViewModel
    
            ' 活性制御無し(CanExecute メソッド無し)なら、LivetCallMethodAction を利用した方が簡潔に書ける
            ' やっていることは【コマンド経由でメソッド呼び出し】をしているので、だったら【直接メソッド呼び出し】しようということです
    
    #Region "ClickCommand"
            Private _ClickCommand As ViewModelCommand
    
            Public ReadOnly Property ClickCommand() As ViewModelCommand
                Get
                    If _ClickCommand Is Nothing Then
                        _ClickCommand = New ViewModelCommand(AddressOf Click)
                    End If
                    Return _ClickCommand
                End Get
            End Property
    
            Private Sub Click()
    
                Console.WriteLine("Click メソッドが呼ばれました")
    
            End Sub
    #End Region
    
            Public Sub Click2()
    
                Console.WriteLine("Click2 メソッドが呼ばれました")
    
            End Sub
    
            Public Sub Click3(obj As Object)
    
                Console.WriteLine($"Click3 メソッドが呼ばれました。{obj} が渡されました")
    
            End Sub
    
            Public Sub Initialize()
            End Sub
    
        End Class
    
    End Namespace
    

    <Window x:Class="Views.LivetCallMethodActionWindow1"
            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:w01_LivetFeature.Views"
            xmlns:vm="clr-namespace:w01_LivetFeature.ViewModels"
            Title="LivetCallMethodActionWindow1" Height="350" Width="525">
        
        <Window.DataContext>
            <vm:LivetCallMethodActionWindow1ViewModel/>
        </Window.DataContext>
        
         <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>
    
            <!--WindowのCloseキャンセル処理に対応する場合は、WindowCloseCancelBehaviorの使用を検討してください-->
    
        </i:Interaction.Triggers>
    
        <StackPanel Margin="10">
    
            <!-- 振る舞いをコマンドで実行 -->
            <Button Content="button1" Command="{Binding ClickCommand}" />
    
            <!-- 振る舞いをメソッドで実行 -->
            <Button Content="button2">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Click2" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
    
            <!-- 振る舞いをメソッドで実行2 -->
            <Button Content="button3">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Click3" MethodParameter="リンゴ" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
    
        </StackPanel>
    
    </Window>
    

  • この3つのボタンを押すと、それぞれメッセージが出力されます。ソースそのままですね。 MethodTarget プロパティに、呼び出したいメソッドが含まれているクラスのインスタンスを設定します。 ここではバインドデータ、つまり LivetCallMethodActionWindow1ViewModel クラスをターゲットにしています。 MethodName プロパティに、呼び出したいメソッド名を指定します。 また、LivetCallMethodAction では引数を1つ受け取ることができますので、MethodParameter プロパティを通して、View から何らかのデータを ViewModel に渡すことができます。

  • 本サンプルは、GitHub にアップしていますので、完全なソースは以下をご覧ください。

  • GitHub
    https://github.com/sutefu7/VbWpfSamples.Other
    w01_LivetFeature