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.