C#中的RelayCommand

All*_*ang 6 c# silverlight delegates mvvm icommand

我正在学习用于C#Silverlight开发的MVVM

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

我对上下文中提到的RelayCommand类感到困惑.代码是:

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
}
Run Code Online (Sandbox Code Playgroud)

对于这些我真的不知道如何_execute_canExecute工作在这种情况下.(我是C#的新手,甚至不确定什么是Action和Predicate.我知道他们是代表,但是他们之间的区别以及它们的工作原理是什么?)
而且,在程序中,我没有得到这条线

    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
Run Code Online (Sandbox Code Playgroud)

有人可以给我解释一下,谢谢!

Kev*_*mey 2

ARelayCommand需要两条信息:

  1. 执行命令时应运行哪些代码(操作_execute
  2. 应运行什么代码来确定是否可以执行该命令(谓词_canExecute

AnAction是代表返回 的方法的委托void。在这种情况下,该_execute操作采用一个参数 (an object) 并返回void

APredicate是一个委托,它接受一个值并返回一个布尔结果。在这种情况下,_canExecute谓词采用一个object值并返回一个bool

_execute值都在构造时_canExecute提供给RelayCommand,因为这些是命令的部分,对于每个单独的命令都是唯一的。

关于此次CanExecuteChanged活动:

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}
Run Code Online (Sandbox Code Playgroud)

当订阅者订阅事件时,add被调用,当订阅者取消订阅时,remove被调用。上述CanExecuteChanged事件只是一个传递事件(即,如果订阅者订阅了该CanExecuteChanged事件,他们就会自动订阅该CommandManager.RequerySuggested事件)。据MSDN 报道,该CommandManager.RequerySuggested事件...

当 CommandManager 检测到可能改变命令执行能力的条件时发生。

我相信订阅者很可能会CanExecute在触发此事件时调用该方法RelayCommand来确定该命令是否仍然可以执行。