web-dev-qa-db-fra.com

Comment utiliser RelayCommand avec le framework MVVM Light

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!!

22
Evan

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.

46
MerickOWA

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;
                        }
                    )
                );
        }
    }
5
Søren Gullach