VB のたまご

作成日: 2017/05/14, 更新日: 2017/05/14



InvokeCommandAction

  •  ここでは、InteractionTrigger トリガーを使って、任意のイベント発生に合わせてコマンドを実行できるアクションの、 InvokeCommandAction について学習します。

  • スポンサーリンク


  •  例えば、View で以下のように記載されていると、 ListBox にある任意の項目を選択したタイミングで、SelectedCommand を実行させることができるようになります。

  • <ListBox 
        Margin="5" 
        ItemsSource="{Binding Items}" 
        SelectedItem="{Binding SelectedItem}" 
        SelectionMode="Single">
      
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <prism:InvokeCommandAction Command="{Binding SelectedCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        
    </ListBox>
    

  •  コマンドでは、何らかの処理を行います。今までにも何度か出てきていましたね。

  • Public Property SelectedCommand As DelegateCommand
    
    ' コンストラクタ
    Public Sub New()
        Me.SelectedCommand = New DelegateCommand(AddressOf Me.Selected)
    End Sub
    
    Private Sub Selected()
        Console.WriteLine(Me.SelectedItem)
    End Sub
    

    スポンサーリンク


  •  また、コマンドにプロパティなどの任意のデータを渡すこともできます。 このサンプルでは、リストボックス内で選択した項目をパラメータとしてコマンドに渡しています。

  • <ListBox Name="listbox1" Margin="5" ItemsSource="{Binding Items}" SelectionMode="Single">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
    
                <!-- listbox1.SelectedItem プロパティを渡す -->
                <prism:InvokeCommandAction 
                    Command="{Binding SelectedCommand}" 
                    CommandParameter="{Binding ElementName=listbox1, Path=SelectedItem}" />
                
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ListBox>
    

  •  コマンドの処理では、渡されてきたデータを使って出力する処理をおこなっています。

  • Public Property SelectedCommand As DelegateCommand(Of String)
    
    ' コンストラクタ
    Public Sub New()
        Me.SelectedCommand = New DelegateCommand(Of String)(AddressOf Me.Selected)
    End Sub
    
    ' Items : ObservableCollection(Of String) のうちの、1つ分の項目
    Private Sub Selected(selectedItem As String)
        Console.WriteLine(selectedItem)
    End Sub
    

  •  さらに、イベント引数のデータもパラメータとして渡すことができます。

  • <ListBox Margin="5" ItemsSource="{Binding Items}" SelectionMode="Single">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
    
                <!-- SelectionChangedEventArgs.AddedItems プロパティを渡す -->
                <prism:InvokeCommandAction 
                    Command="{Binding SelectedCommand}" 
                    TriggerParameterPath="AddedItems" />
                
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ListBox>
    

    Public Property SelectedCommand As DelegateCommand(Of Object())
    
    ' コンストラクタ
    Public Sub New()
        Me.SelectedCommand = New DelegateCommand(Of Object())(AddressOf Me.Selected)
    End Sub
    
    Private Sub Selected(selectedItems As Object())
    
        If selectedItems IsNot Nothing AndAlso 0 < selectedItems.Count() Then
            Console.WriteLine($"{selectedItems.FirstOrDefault()}")
        End If
    
    End Sub