簡體   English   中英

如何將 RelayCommand 與 MVVM Light 框架一起使用

[英]How to use RelayCommand with the MVVM Light framework

我剛剛開始學習 MVVM Light 框架,我找不到任何關於如何使用 RelayCommand 的簡單示例。 出於學習的目的,我只想在我的視圖中有一個按鈕,單擊該按鈕時顯示的是一個 hello world 消息框,並且每隔一分鍾啟用(基本上如果 DateTime.Now.Minute % 2 == 0) .

按鈕 XAML 的外觀如何以及如何在 ViewModel 中定義 RelayCommand HelloWorld?

謝謝你的幫助!!

RelayCommand的目的是實現 Button 控件所需的ICommand接口,並將調用傳遞給其他一些 function,它們通常位於 ViewModel 中它們旁邊。

因此,例如,您將有一個 ViewModel class ,例如:

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 中設置 DataContext

然后,您的按鈕將綁定到 ViewModel 中的命令,如下所示

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

單擊 Button 時,它使用DisplayMessageCommand並在此 object 上調用Execute()RelayCommand將其轉發到DisplayMessage方法。

DispatchTimer每分鍾關閉一次並調用RaiseCanExecuteChanged() 這允許綁定到命令的按鈕重新檢查命令是否仍然有效。 否則,您可能會單擊該按鈕而發現該命令當前不可用。

或與 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;
                        }
                    )
                );
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM