Jak używać RelayCommand z frameworkiem MVVM Light

Właśnie zacząłem uczyć się frameworka MVVM Light i nie mogę znaleźć żadnych prostych przykładów, jak używać polecenia RelayCommand. Dla celów nauki, chciałbym tylko mieć przycisk w moim widoku, który po kliknięciu Pokaż okno wiadomości hello world world, i który jest włączony w każdej parzystej minucie (w zasadzie Jeśli DateTime.Teraz.Minuta % 2 == 0).

Jak wyglądałby przycisk XAML i jak definiowałby Relaycommand HelloWorld w modelu widoku?

Thanks for your pomocy!!

Author: Evan, 2011-07-20

2 answers

RelayCommand'celem s jest zaimplementowanie interfejsu ICommand potrzebnego do sterowania przyciskami i po prostu przekazanie wywołań do innej funkcji, która zazwyczaj znajduje się tuż obok nich w ViewModel.

Więc na przykład, masz klasę ViewModel jak:

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

Pod twoją kontrolą będziesz miał DataContext ustawiony albo w kodzie za, albo w XAML bezpośrednio przez DataContext={StaticResource ...}

Twój przycisk połączy się z poleceniem w ViewModel, jak więc

<Button Content='Push me' Command='{Binding DisplayMessageCommand}' />

Po kliknięciu przycisku, używa on DisplayMessageCommand i wywołuje Execute() na tym obiekcie, który RelayCommand przechodzi do metody DisplayMessage.

DispatchTimer wyłącza się raz na minutę i dzwoni RaiseCanExecuteChanged(). Pozwala to przyciskowi powiązanemu z poleceniem ponownie sprawdzić, czy polecenie jest nadal ważne, czy nie. W przeciwnym razie możesz kliknąć przycisk tylko, aby dowiedzieć się, że polecenie nie jest obecnie dostępne.

 41
Author: MerickOWA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 03:05:53

Lub z 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
Author: Søren Gullach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-03 12:16:31