[Infraestructura - Net 7.0 -] - Command - DelegateCommand

Descripción general:

Delegate Command implementa la interfaz ICommand. Sus instancias son objetos de comando a través de los cuales la vista puede llamar a métodos. Como sus nombres indican, [Execute] es el método real del comando, y [canExecute] es lo que decide si es posible ejecutar el comando.


↑↑↑

La interfaz Icommand

Está compuesta por:
  • CanExecuteChanged (Evento) : Evento, se invoca cuando se producen cambios que pueden cambiar si se puede ejecutar o no el comando.
  • CanExecute(Object) Determinará si el comando se puede ejecutar o no. Si devuelve false, el botón (enlazado) se desactivará en la interfaz.
  • Execute(Object) : Ejecuta la lógica del comando.

↑↑↑

Cómo implementar un ICommand reutilizable

Si está utilizando el patrón MVVM (modelo-vista-modelo), uno de los mecanismos más utilizados para vincular acciones a la vista son los comandos. Para proporcionar un comando, debe implementar la interfaz. Esto es bastante simple, pero tienes que hacerlo una y otra vez. Esto es engorroso

La idea de este patrón es crear un comando universal, que requiere dos delegados: uno que se llama, cuando se invoca [ICommand.CanExecute(object param)] y otro que evalúa el estado del comando cuando se llama. [ICommand.Execute(object param) ]

Además de esto, necesitamos un método que desencadene el evento [commmand.CanExecuteChanged]n lo que obliga a la interfaz de usuario vuelva a evaluar el metodo CanExecute()


↑↑↑

Implementatión simple


'
public class DelegateCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;
 
    public event EventHandler CanExecuteChanged;
 
    public DelegateCommand(Action<object> execute) 
                   : this(execute, null)
    {
    }
 
    public DelegateCommand(Action<object> execute, 
                   Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }
 
    public override bool CanExecute(object parameter)
    {
        if (_canExecute == null)
        {
            return true;
        }
 
        return _canExecute(parameter);
    }
 
    public override void Execute(object parameter)
    {
        _execute(parameter);
    }
 
    public void RaiseCanExecuteChanged()
    {
        if( CanExecuteChanged != null )
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
    }
}
'


↑↑↑

↑↑↑

Mi clase Personalizada DelegateCommand

Enlace de descarga