2010-08-22 84 views
3

使用我读约什 - 史密斯” WPF Apps With The Model-View-ViewModel Design Pattern教程需要帮助理解MVVM教程,RelayCommand&lambda表达式

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

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

另外,保存命令配置了lambda表达式。第一,有2个参数变量。 他们会冲突吗?我不能只是像RelayCommand(this.Save(), this.CanSave)那样做,或者是没有这样的语法。

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

这可以帮助你。 http://stackoverflow.com/questions/2281566/is-josh-smiths-implementation-of-the-relaycommand-flawed – 2010-08-25 09:41:06

回答

3
  1. CommandManager.RequerySuggested += value意味着,如果CanExecute功能可以解决这两个truefalse取决于一些条件。

    如果WPF的评估结果为false,并且在条件评估结果为true时启用,则WPF将禁用Button/MenuItemCommandButtonBase)。
    如果你没有这两条线,WPF会问命令只有一次(当按钮/菜单项被加载,除非你做手工,不会后更新。

  2. 两个参数(拉姆达表达式)是Action<object>型和A Predicate<object>所以,他们不能,根据定义,冲突(params只是一个名字 - 和两个功能有不同的范围 - 他们不冲突)

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

    • private void Save(object obj)

      private bool CanSave(object obj)

    分别,但你不应该有()末 - 所以新RelayCommand(this.Save,this.CanSave)应该工作。

+0

1我不明白'CanExecuteChanged'是添加/删除。它看起来像我一个getter/setter,当我为'CanExecuteChanged'添加事件处理程序时,我也将它添加到'CommandManager.RequerySuggested'事件中。删除相同?但你说价值可以评估为真/假。那么实际上添加/删除是什么?同样假设value是bool,那么'CommandManager'如何知道禁用哪个控件? – 2010-08-23 01:54:48

+0

添加/删除是每次添加命令时发生的事情.CanExecuteChanged + = SomeRoutine(当然是 - =)。所以,每次WPF引擎都会向命令添加一个处理程序(这是将它添加到后台的按钮的Command属性时发生的情况),我们向CommandManager添加一个钩子 - 该钩子包含值(即按钮)和命令 - 然后当CommandManager决定足够改变时,CanExecute可能会不同 - 它告诉Button向Command询问新的CanExecute - 从而取消/启用按钮。 – Goblin 2010-08-23 07:33:02