Как использовать RelayCommand с фреймворком MVVM Light - PullRequest
19 голосов
/ 20 июля 2011

Я только начал изучать инфраструктуру MVVM Light и не могу найти простых примеров того, как использовать RelayCommand.В целях обучения я просто хотел бы, чтобы в моем представлении была кнопка, которая при нажатии на кнопку show показывает окно сообщения hello world world, и которая включается каждую четную минуту (в основном, если DateTime.Now.Minute% 2 == 0).

Как будет выглядеть кнопка XAML и как будет определен RelayCommand HelloWorld во ViewModel?

Спасибо за вашу помощь !!

Ответы [ 2 ]

42 голосов
/ 20 июля 2011
Цель

RelayCommand состоит в том, чтобы реализовать интерфейс ICommand, который нужен элементам управления Button, и просто передавать вызовы какой-либо другой функции, которая обычно находится рядом с ними в ViewModel.

Например, у вас будет класс ViewModel, такой как:

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

В вашем контроле вы будете иметь DataContext, установленный либо в коде позади, либо в XAML напрямую через DataContext={StaticResource ...}

Ваша кнопка будет затем привязываться к команде в ViewModel, например:

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

При нажатии кнопки она использует DisplayMessageCommand и вызывает Execute() для этого объекта, который RelayCommand просто перенаправляет наDisplayMessage метод.

DispatchTimer гаснет один раз в минуту и ​​вызывает RaiseCanExecuteChanged().Это позволяет кнопке, связанной с командой, перепроверить, действительна ли команда или нет.В противном случае вы можете нажать кнопку только для того, чтобы узнать, что команда в данный момент недоступна.

5 голосов
/ 03 сентября 2014

или с лямбдой

    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;
                        }
                    )
                );
        }
    }
...