我正在阅读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 );
答案 0 :(得分:3)
CommandManager.RequerySuggested += value
表示如果CanExecute
的功能可以根据某些条件解析为true
和false
。
如果评估为Button/MenuItem
,WPF将停用CommandButtonBase
(false
),并在条件评估为true
时启用。
如果你没有这两行,WPF只会询问命令一次(当 Button / MenuItem 加载时,除非你手动执行,否则不会更新。
两个参数(lambda表达式)分别是Action<object>
和Predicate<object>
类型。因此,根据定义,它们不能发生冲突(params
只是一个名称 - 因为这两个函数具有不同的范围 - 它们不会发生冲突)。
如果您的方法具有正确的签名,则可以在构造函数
中使用该方法private void Save(object obj)
private bool CanSave(object obj)
,但最后不应该有()
- 所以新的RelayCommand(this.Save,this.CanSave)
应该有用。