3

我正在阅读 Josh Smith 的带有模型-视图-视图模型设计模式教程 的WPF 应用程序

我不明白下面的代码试图做什么。
首先,语法提醒我属性,但使用添加/删除代替。

但什么是CommandManager.RequerySuggested

它将事件订阅委托给 CommandManager.RequerySuggested 事件。这可确保 WPF 命令基础结构在询问内置命令时询问所有 RelayCommand 对象是否可以执行

//Figure 3 The RelayCommand Class
public class RelayCommand : ICommand 
{ 
#region Fields 
    readonly Action<object> _execute; 
    readonly Predicate<object> _canExecute; 
#endregion // Fields
#region Constructors 
public RelayCommand(Action<object> execute) : this(execute, null) 
{ } 
public RelayCommand(Action<object> execute, Predicate<object> canExecute) 
{ 
    if (execute == null) throw new ArgumentNullException("execute"); 
   _execute = execute; 
   _canExecute = canExecute; 
} 
#endregion // Constructors 
#region ICommand Members 
[DebuggerStepThrough] 
public bool CanExecute(object parameter) 
{ 
    return _canExecute == null ? true : _canExecute(parameter); 
} 
public event EventHandler CanExecuteChanged 
{ 
    add    { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 
public void Execute(object parameter) 
{ _execute(parameter); } 
#endregion // ICommand Members }

此外,保存命令配置了 lambdas。第一,有 2 个参数变量。他们会冲突吗?我不能只做类似的事情,RelayCommand(this.Save(), this.CanSave)或者没有这样的语法。

_saveCommand = new RelayCommand(param => this.Save(),
                                param => this.CanSave );
4

1 回答 1

3
  1. CommandManager.RequerySuggested += value表示如果函数 for可以根据某些条件 CanExecute解析两者truefalse

    如果 WPF 的计算结果为 ,则WPF 将禁用Button/MenuItem( CommandButtonBase)false并在条件计算为 时启用true
    如果您没有这两行,WPF 将只询问一次命令(当加载Button/MenuItem时,除非您手动执行,否则此后不会更新。

  2. 这两个参数(lambda 表达式)分别是 typeAction<object>和 a Predicate<object>。因此,根据定义,它们不能冲突(params只是一个名称 - 由于这两个函数具有不同的范围 - 它们不会冲突)。

    如果您有一个具有正确签名的方法,则可以在构造函数中使用它

    • private void Save(object obj)

      private bool CanSave(object obj)

    分别,但你不应该()在最后 - 所以 newRelayCommand(this.Save,this.CanSave)应该可以工作。

于 2010-08-22T15:51:39.387 回答