web-dev-qa-db-ja.com

MVVM LightフレームワークでRelayCommandを使用する方法

MVVM Lightフレームワークの学習を開始したばかりで、RelayCommandの使用方法に関する簡単な例を見つけることができません。学習のために、ビューにボタンをクリックすると、ショーをクリックするとhello world worldメッセージボックスが表示され、偶数分ごとに有効になります(基本的にはDateTime.Now.Minute%2 == 0の場合)。 。

ボタンXAMLはどのように見え、RelayCommand HelloWorldはViewModelでどのように定義されますか?

ご協力いただきありがとうございます!!

22
Evan

RelayCommandの目的は、Buttonコントロールが必要とするICommandインターフェイスを実装し、通常は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をコードビハインドまたは_DataContext={StaticResource ...}_を介してXAMLに直接設定します。

ボタンは、ViewModelのコマンドに次のようにバインドします

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

ボタンがクリックされると、DisplayMessageCommandを使用し、このオブジェクトでExecute()を呼び出します。このオブジェクトは、RelayCommandDisplayMessageメソッドに転送するだけです。

DispatchTimerは1分に1回オフになり、RaiseCanExecuteChanged()を呼び出します。これにより、コマンドにバインドされているボタンで、コマンドがまだ有効かどうかを再確認できます。それ以外の場合は、ボタンをクリックして、コマンドが現在使用できないことを確認するだけです。

46
MerickOWA

またはラムダと

    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