Using the EventToCommandBehavior

The EventToCommandBehavior class provides a convenient way to, in XAML, "bind" events to ICommand according to MVVM paradigm to avoid code behind.

Properties

The EventToCommandBehavior expose the following properties

  • EventName The name of the event to listen to. For example ItemTapped
  • Command The ICommand that will be executed when the event is raised
  • CommandParameter The parameter that will be sent to the ICommand.Execute(object) method
  • EventArgsConverter Instance of IValueConverter that allows operating on the EventArgs type for the EventName
  • EventArgsConverterParameter The parameter that will be sent as the parameter argument to IValueConverter.Convert method
  • EventArgsParameterPath Parameter path to extract property from EventArgs that will be passed to ICommand.Execute(object)

Usage

First declare the namespace and assembly in where EventToCommandBehavior is declared and declare a XML-namespace.

xmlns:prism="http://prismlibrary.com"

CommandParameter

Bind or declare a parameter that will be sent to the ICommand.Execute(object) method.

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
 x:Class="MyNamespace.ContentPage"
 xmlns:prism="http://prismlibrary.com">
 <ListView>
 <ListView.Behaviors>
 <prism:EventToCommandBehavior EventName="ItemTapped"
 Command="{Binding ItemTappedCommand}"
 CommandParameter="MyParameter" />
 </ListView.Behaviors>
 </ListView>
</ContentPage>

EventArgsConverter

Using the EventArgsConverter to retrieve the ItemTappedEventArgs.Item property.

using System;
using System.Globalization;
using Xamarin.Forms;
namespace Prism.Converters
{
 public class ItemTappedEventArgsConverter : IValueConverter
 {
 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {
 var itemTappedEventArgs = value as ItemTappedEventArgs;
 if (itemTappedEventArgs == null)
 {
 throw new ArgumentException("Expected value to be of type ItemTappedEventArgs", nameof(value));
 }
 return itemTappedEventArgs.Item;
 }
 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
 {
 throw new NotImplementedException();
 }
 }
}

The XAML need a reference to the converter and the converter resource need to be defined

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
 x:Class="MyNamespace.ContentPage"
 xmlns:prism="http://prismlibrary.com"
 xmlns:c="clr-namespace:AwesomeApp.Converters;assembly=YourProject">
 <ContentPage.Resources>
 <ResourceDictionary>
 <c:ItemTappedEventArgsConverter x:Key="itemTappedEventArgsConverter" />
 </ResourceDictionary>
 </ContentPage.Resources>
 <ListView>
 <ListView.Behaviors>
 <prism:EventToCommandBehavior EventName="ItemTapped"
 Command="{Binding ItemTappedCommand}"
 EventArgsConverter="{StaticResource itemTappedEventArgsConverter}" />
 </ListView.Behaviors>
 </ListView>
</ContentPage>

EventArgsParameterPath

Attach the command to ItemTapped event will raise the ItemTappedEventArgs event.

public class ItemTappedEventArgs : EventArgs
{
 public object Item { get; }
 public object Group { get; }
}

Setting EventArgsParameterPath to Item will extract the property value and pass it to the ICommand.Execute(object) method

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
 x:Class="MyNamespace.ContentPage"
 xmlns:prism="http://prismlibrary.com">
 <ListView>
 <ListView.Behaviors>
 <prism:EventToCommandBehavior EventName="ItemTapped"
 Command="{Binding ItemTappedCommand}"
 EventArgsParameterPath="Item" />
 </ListView.Behaviors>
 </ListView>
</ContentPage>