Primeros pasos con mvvm-light

Comando de retransmisión

El RelayCommand implementa la interfaz ICommand y, por lo tanto, se puede usar para vincular Commands en XAML (como la propiedad Command del elemento Button)

El constructor toma dos argumentos; la primera es una Acción que se ejecutará si se llama a ICommand.Execute (por ejemplo, el usuario hace clic en el botón), la segunda es una Func<bool> que determina si la acción se puede ejecutar (por defecto a verdadero, llamado canExecute en el siguiente párrafo).

la estructura básica es la siguiente:

public ICommand MyCommand => new RelayCommand(
    () =>
    {
        //execute action
        Message = "clicked Button";
    },
    () =>
    {
        //return true if button should be enabled or not
        return true;
    }
);

Algunos efectos notables:

  • Si canExecute devuelve falso, el Button se desactivará para el usuario
  • Antes de que la acción se ejecute realmente, canExecute se verificará nuevamente
  • Puede llamar a MyCommand.RaiseCanExecuteChanged(); para forzar la reevaluación de canExecute Func

Comando de retransmisión

RelayCommand<T> es similar a RelayCommand, pero permite pasar directamente un objeto al comando. Implementa la interfaz ICommand y, por lo tanto, se puede usar para vincular Commands en XAML (por ejemplo, como la propiedad Command del elemento Button). Luego puede usar la propiedad CommandParameter para pasar el objeto al comando.

Ejemplo XAML:

<Button Command="{Binding MyCommand}" CommandParameter="{Binding MyModel}" />

El constructor toma dos argumentos; la primera es una Action que se ejecutará si se llama a ICommand.Execute (por ejemplo, el usuario hace clic en el botón), la segunda es una Func<string,bool> que determina si la acción se puede ejecutar (el valor predeterminado es verdadero, llamado canExecute en el siguiente párrafo). la estructura básica es la siguiente:

public RelayCommand<string> MyCommand => new RelayCommand<string>(
    obj =>
    {
        //execute action
        Message = obj;
    },
    obj =>
    {
        //return true if button should be enabled or not
        return obj != "allowed";
    }
);

Algunos efectos notables:

  • Si canExecute devuelve falso, el Button estará deshabilitado para el usuario
  • Antes de que la acción se ejecute realmente, canExecute se verificará nuevamente
  • Puede llamar a MyCommand.RaiseCanExecuteChanged(); para forzar la reevaluación de canExecute Func

Objeto Observable

La clase ObservableObject contiene algunos métodos útiles para ayudar con el patrón MVVM.

RaisePropertyChanged proporciona un método seguro de compilación para generar eventos de cambio de propiedad. Se puede llamar con

RaisePropertyChanged(() => MyProperty);

El método Set se puede usar en el setter de propiedad para establecer el nuevo valor y generar el evento de cambio de propiedad (solo si se produjo un cambio). Devuelve verdadero si se produjo un cambio y falso en caso contrario. ejemplo de uso:

private string _myValue;
public string MyValue    
{
    get { return _myValue; }
    set { Set(ref _myValue, value); }
}

VerModeloBase

ViewModelBase extiende ObservableObject y agrega algunos métodos útiles para los modelos de vista.

La propiedad IsInDesignMode o IsInDesignModeStatic permite determinar si el código se ejecuta en modo diseño (en Visual Studio Design View) o no. Las dos propiedades son exactamente iguales.