【问题标题】:How to use RelayCommand with the MVVM Light framework如何将 RelayCommand 与 MVVM Light 框架一起使用
【发布时间】:2011-10-08 22:30:21
【问题描述】:

我刚刚开始学习 MVVM Light 框架,我找不到任何关于如何使用 RelayCommand 的简单示例。出于学习的目的,我只想在我的视图中有一个按钮,单击该按钮时显示的是一个 hello world 消息框,并且每隔一分钟启用(基本上如果 DateTime.Now.Minute % 2 == 0) .

按钮 XAML 的外观如何以及如何在 ViewModel 中定义 RelayCommand HelloWorld?

感谢您的帮助!!

【问题讨论】:

    标签: c# wpf mvvm mvvm-light


    【解决方案1】:

    或者使用 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;
                            }
                        )
                    );
            }
        }
    

    【讨论】:

      【解决方案2】:

      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={StaticResource ...}直接在 XAML 中设置 DataContext

      然后您的按钮会像这样绑定到 ViewModel 中的命令

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

      当按钮被点击时,它使用DisplayMessageCommand 并在这个对象上调用Execute() RelayCommand 只是转发到DisplayMessage 方法。

      DispatchTimer 每分钟响一次并呼叫RaiseCanExecuteChanged()。这允许绑定到命令的按钮重新检查命令是否仍然有效。否则,您可能会单击该按钮才发现该命令当前不可用。

      【讨论】:

      • 出于好奇,有没有办法将命令的 CanDisplayMessage() 绑定到 IsEnabled 属性?
      • @evan,如果你的意思是按钮的 IsEnabled 属性?如果您在 Button 上设置 Command 对象,则会自动完成此操作
      • 除了此处非常完整的示例之外,请注意以下几点: - 如果您不想命名 Execute 和 CanExecute 方法,可以使用 lambda 表达式作为委托。 - 除了所有 ButtonBase 控件(Button、RadioButton、CheckBox 等)上的 Command 属性外,您还可以使用 EventToCommand 行为(在 MVVM Light“附加”中可用)将任何事件绑定到命令。
      • @LBurgnion - 感谢您指出 EventToCommand,很高兴知道!
      • 让我为你解决这个问题...public ICommand DisplayMessageCommand { get; private set; }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多