Je viens de commencer à apprendre le framework MVVM Light et je ne trouve aucun exemple simple sur la façon d'utiliser une RelayCommand. À des fins d'apprentissage, j'aimerais simplement avoir un bouton à mon avis qui, lorsqu'il est cliqué, affiche une boîte de message du monde bonjour, et qui est activé toutes les minutes paires (essentiellement si DateTime.Now.Minute% 2 == 0) .
À quoi ressemblerait le bouton XAML et comment le RelayCommand HelloWorld serait-il défini dans le ViewModel?
Merci de votre aide!!
Le but de RelayCommand
est d'implémenter l'interface ICommand
dont Button contrôle les besoins et de simplement passer les appels à une autre fonction qui se trouve généralement juste à côté d'eux dans le ViewModel.
Ainsi, par exemple, vous auriez une classe ViewModel comme:
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
}
}
Dans votre contrôle, vous auriez le DataContext
défini dans le code derrière ou dans le XAML directement via un DataContext={StaticResource ...}
Votre bouton serait alors lié à la commande dans le ViewModel comme si
<Button Content='Push me' Command='{Binding DisplayMessageCommand}' />
Lorsque le bouton est cliqué, il utilise le DisplayMessageCommand
et appelle Execute()
sur cet objet que RelayCommand
transfère juste sur la méthode DisplayMessage
.
DispatchTimer
s'éteint une fois par minute et appelle RaiseCanExecuteChanged()
. Cela permet au bouton lié à la commande de vérifier à nouveau si la commande est toujours valide ou non. Sinon, vous pouvez cliquer sur le bouton uniquement pour découvrir que la commande n'est pas actuellement disponible.
Ou avec 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;
}
)
);
}
}