1

为什么以下函数在 WPF MVVM 中采用对象类型的参数?

 public ViewModel()
 {
 SaveCommand2 = new DelegateCommand(SaveCommand_Execute);
 }

 bool SaveCommand_CanExecute(object arg)
 {
        return Model.Name != string.Empty;
 }

默认情况下,我们不会在函数中传递任何参数,因为 NULL 会传递给它。

如果我们不想传递任何东西,最好从函数中删除参数。但它不允许。为什么?

4

4 回答 4

2

DelegateCommand是用于创建命令的“通用”实现。WPF 命令有一个可选的CommandParameter,用于在执行时向命令提供数据。这就是为什么DelegateCommand有一个参数类型的原因object,如果使用命令参数绑定,则通过此参数传递参数。

于 2013-12-06T06:32:08.703 回答
2

我认为您可以创建命令的自定义实现delegate来克服这个问题。您可以查看Simplify DelegateCommand 以了解最常见的场景以获取更多信息。

于 2013-12-06T06:37:18.647 回答
1

尝试这个,

 public ViewModel()
 {
 SaveCommand2 = new DelegateCommand(new Action(() =>
                {
                  //Your action stuff.
                }), SaveCommand_CanExecute);
 }

 bool SaveCommand_CanExecute()
 {
        return Model.Name != string.Empty;
 }
于 2013-12-06T06:47:36.023 回答
1

如果您实现自己的 DelegateCommand,您可以拥有接收无参数操作的构造函数,如以下代码所示:

public DelegateCommand(Action<object> execute, Func<object, bool> canExecute)
{
  if (execute == null)
    throw new ArgumentNullException("execute", "execute cannot be null");
  if (canExecute == null)
    throw new ArgumentNullException("canExecute", "canExecute cannot be null");

  _execute = execute;
  _canExecute = canExecute;
}

public DelegateCommand(Action<object> execute)
  : this(execute, (o) => true)
{

}

public DelegateCommand(Action execute)
  : this((o) => execute())
{

}

使用最后一个构造函数重载,您可以做到

var someCommand = new DelegateCommand(SomeMethod);

其中Method是无参数的

于 2013-12-06T15:48:57.003 回答