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

19
demandé sur Evan 2011-07-20 01:56:41

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.

41
répondu MerickOWA 2013-12-17 03:05:53

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
répondu Søren Gullach 2017-07-03 12:16:31