RelayCommand
tiene como objetivo implementar la interfaz ICommand
que Button necesita y pasar las llamadas a otra función que generalmente se encuentra junto a ellas en ViewModel.
Así, por ejemplo, tendría que tener una clase ViewModel como:
class HelloWorldViewModel : ViewModelBase
{
public RelayCommand DisplayMessageCommand { get; private set; }
private DispatchTimer _timer;
public HelloWorldViewModel()
{
this.DisplayMessageCommand = new RelayCommand(this.DisplayMessage, CanDisplayMessage);
// Create a timer to go off once a minute to call RaiseCanExecuteChanged
_timer = new DispatchTimer();
_timer = dispatcherTimer.Tick += OnTimerTick;
_timer.Interval = new Timespan(0, 1, 0);
_timer.Start();
}
private void OnTimerTick(object sender, EventArgs e)
{
this.DisplayMessageCommand.RaiseCanExecuteChanged();
}
public bool CanDisplayMessage()
{
return DateTime.Now.Minute % 2 == 0;
}
public void DisplayMessage()
{
//TODO: Do code here to display your message to the user
}
}
En el control que tendría el DataContext
conjunto, ya sea en el código detrás o en el XAML directamente a través de un DataContext={StaticResource ...}
Su botón entonces unirse a la orden en el modelo de vista al igual que
<Button Content='Push me' Command='{Binding DisplayMessageCommand}' />
Cuando se hace clic en el botón, se utiliza el DisplayMessageCommand
y llama al Execute()
en este objeto que RelayCommand
acaba de pasar al método DisplayMessage
.
El DispatchTimer
se apaga una vez por minuto y llama al RaiseCanExecuteChanged()
. Esto permite que el botón que está vinculado al comando vuelva a verificar si el comando sigue siendo válido o no. De lo contrario, puede hacer clic en el botón solo para descubrir que el comando no está disponible actualmente.
Gran! ¡Gracias por aclarar eso para mí! – Evan
Solo por curiosidad, ¿hay alguna manera de vincular el CanDisplayMessage() del comando con la propiedad IsEnabled? – Evan
@evan, si se refiere a la propiedad IsEnabled del Botón? Esto se hace automáticamente si configura el objeto Comando en el Botón – MerickOWA