Binding Events to Commands
The InvokeCommandAction class provides a convenient way to, in XAML, "bind" events to ICommand properties according to the MVVM paradigm of avoiding code behind.
Properties
The InvokeCommandAction exposes the following properties:
Commandidentifies the command to execute when invoked. This is required.AutoEnableidentifies if the associated element should automatically be enabled or disabled based on the result of the Command'sCanExecute. This is an optional field, default value isTrue.CommandParameteridentifies the command parameter to be supplied to the command. This is an optional field.TriggerParameterPathidentifies the path in the event supplied object to be parsed to identify the child property to be used as the command parameter.
Usage
Basic Usage
First the binding needs to be hooked up in WPF by specifying an InteractionTrigger. This is standard out-of-the-box functionality in WPF. Add the namespace to be able to declare it in the XAML.
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
Add the Prism namespace to be able to declare InvokeCommandAction in the XAML.
xmlns:prism="http://prismlibrary.com"
And attach to the control with the desired event.
<Window x:Class="UsingInvokeCommandAction.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525">
<Grid>
<ListBox ItemsSource="{Binding Items}" SelectionMode="Single">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<prism:InvokeCommandAction Command="{Binding SelectedCommand}"
CommandParameter="{Binding MyParameter}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
</Grid>
</Window>
TriggerParameterPath
In the code below, the SelectionChanged event receives a SelectionChangedEventArgs object that has an IList property named AddedItems. Use the TriggerParameterPath to specify this property to be passed as the parameter in the ICommand object.
<Window x:Class="UsingInvokeCommandAction.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525">
<Grid>
<ListBox ItemsSource="{Binding Items}" SelectionMode="Single">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<prism:InvokeCommandAction Command="{Binding SelectedCommand}"
CommandParameter="{Binding MyParameter}"
TriggerParameterPath="AddedItems" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
</Grid>
</Window>
AutoEnable
The AutoEnable property specifies if the associated element should be automatically enabled or disabled based on the result of the ICommand.CanExecute. This defaults to true as this is the most common use.
<Window x:Class="UsingInvokeCommandAction.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525">
<Grid>
<ListBox ItemsSource="{Binding Items}" SelectionMode="Single">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<prism:InvokeCommandAction Command="{Binding SelectedCommand}"
CommandParameter="{Binding MyParameter}"
TriggerParameterPath="AddedItems"
AutoEnable="true" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
</Grid>
</Window>
Full Code Sample
For a complete code example, go to the Prism-Samples-Wpf repository in GitHub and refer to 29-InvokeCommandAction.