example commandmanager c# wpf mvvm mvvm-light

commandmanager - command mvvm c#



Cómo usar RelayCommand con el marco MVVM Light (2)

O con lambda

private RelayCommand<anyobject> _AddCmd; public ICommand AddPoint { get { return _AddCmd ?? ( _AddCmd = new RelayCommand ( (obj) => { ViewModelWF.ZeroPoints.Add(new WM.Point(0, 0)); } ) ); } } private RelayCommand _DeleteCmd; public ICommand DeletePoint { get { return _DeleteCmd ?? ( _DeleteCmd = new RelayCommand ( () => { int idx = wpfZeroPoints.SelectedIndex; }, () => { return wpfZeroPoints.SelectedIndex <= 0; } ) ); } }

Acabo de comenzar a aprender el marco MVVM Light y no puedo encontrar ejemplos sencillos sobre cómo usar RelayCommand. Para fines de aprendizaje, me gustaría tener un botón en mi vista que al hacer clic muestre un cuadro de mensaje hola mundo mundial, y que esté habilitado en cada minuto (básicamente, si DateTime.Now.Minute% 2 == 0) .

¿Cómo se vería el botón XAML y cómo se definiría RelayCommand HelloWorld en ViewModel?

¡¡Gracias por tu ayuda!!


El propósito de RelayCommand es implementar la interfaz ICommand que Button controla y solo pasar las llamadas a alguna otra función que generalmente se encuentra al lado de ellos en el ViewModel.

Entonces, por ejemplo, tendrías una clase de 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 su control, tendría el DataContext establecido en el código detrás o en el XAML directamente a través de un DataContext={StaticResource ...}

Su botón se enlazará al comando en el ViewModel como tal

<Button Content=''Push me'' Command=''{Binding DisplayMessageCommand}'' />

Cuando se hace clic en el botón, utiliza el DisplayMessageCommand y llama a Execute() en este objeto que RelayCommand solo reenvía al método DisplayMessage .

DispatchTimer se apaga una vez por minuto y llama a 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.