需要帮助理解MVVM教程,RelayCommand&使用lambdas

时间:2010-08-22 14:58:33

标签: c# wpf design-patterns mvvm icommand

我正在阅读Josh Smith'WPF Apps With The Model-View-ViewModel Design Pattern教程

我不明白以下代码试图做什么 首先,语法提醒我属性,但改为添加/删除。

但是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 }

此外,save命令配置了lambdas。 1,有2个参数变量。 他们会发生冲突吗我不能只做像RelayCommand(this.Save(), this.CanSave)这样的事情,或者没有这样的语法。

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

1 个答案:

答案 0 :(得分:3)

  1. CommandManager.RequerySuggested += value表示如果CanExecute的功能可以根据某些条件解析为truefalse

    如果评估为Button/MenuItem,WPF将停用CommandButtonBasefalse),并在条件评估为true时启用。
    如果你没有这两行,WPF只会询问命令一次(当 Button / MenuItem 加载时,除非你手动执行,否则不会更新。

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

    如果您的方法具有正确的签名,则可以在构造函数

    中使用该方法
    • private void Save(object obj)

      private bool CanSave(object obj)
    分别是

    ,但最后不应该有() - 所以新的RelayCommand(this.Save,this.CanSave)应该有用。