using System;
using System.Windows.Input;
namespace Developpez.Dotnet.Windows.Input
{
///
/// Représente une commande sur laquelle on peut binder des contrôles dans le cadre du pattern MVVM.
///
/// Cette classe a été proposée par Josh Smith dans son projet Crack.NET.
public class RelayCommand : ICommand
{
#region Champs
readonly Action _execute;
readonly Predicate _canExecute;
#endregion // Champs
#region Constructeurs
///
/// Crée une nouvelle instance de RelayCommand avec l'action spécifiée
///
/// Action à exécuter quand la commande est invoquée
public RelayCommand(Action execute)
: this(execute, null)
{
}
///
/// Crée une nouvelle instance de RelayCommand avec l'action et le prédicat spécifiés
///
/// Action à exécuter quand la commande est invoquée
/// Prédicat qui indique si la commande peut être exécutée
public RelayCommand(Action execute, Predicate canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion // Constructeurs
#region Membres de ICommand
///
/// Indique si la commande peut être exécutée avec le paramètre spécifié
///
/// Paramètre de la commande
/// true si la commande peut être exécutée, false sinon
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
///
/// Se produit lorsque des modifications influent sur l'exécution de la commande
///
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
///
/// Exécute la commande avec le paramètre spécifié
///
/// Paramètre avec lequel exécuter la commande
public void Execute(object parameter)
{
_execute(parameter);
}
#endregion // Membres de ICommand
}
}