Comment utiliser RelayCommand avec le MVVM Light framework
je viens de commencer à apprendre le MVVM Light framework et je ne peux trouver aucun exemple simple sur la façon d'utiliser un RelayCommand. Pour des raisons d'apprentissage, je voudrais juste avoir un bouton dans ma vue qui, lorsque cliqué montre une boîte de message hello world, et qui est activé à chaque minute Pair (essentiellement si DateTime.Maintenant.Minut % 2 = = 0).
à quoi ressemblerait le bouton XAML et comment le RelayCommand HelloWorld serait-il défini dans le ViewModel?
Merci pour votre aide!!
2 réponses
RelayCommand
le but est de mettre en œuvre le ICommand
interface Bouton de contrôle besoins et juste passer les appels sur une autre fonction qui généralement se trouve 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
}
}
sous votre contrôle vous auriez le DataContext
placé soit dans le code derrière ou dans le XAML directement à travers un DataContext={StaticResource ...}
votre bouton se liera alors à la commande dans le ViewModel comme so
<Button Content='Push me' Command='{Binding DisplayMessageCommand}' />
quand le bouton est cliqué, il utilise le DisplayMessageCommand
et appelle Execute()
sur cet objet qui RelayCommand
juste en avant sur la méthode DisplayMessage
.
le DispatchTimer
sonne une fois par minute et appelle RaiseCanExecuteChanged()
. Cela permet au bouton qui est lié à la commande de re-vérifier si la commande est toujours valide ou pas. Autrement, vous pouvez cliquez sur le bouton pour que la commande n'est pas disponible actuellement.
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;
}
)
);
}
}