我正在从中学习用于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
}

对于这种情况,我不太了解_execute_canExecute的工作原理。 (我是C#的新手,甚至不确定什么是Action和Predicate。我知道它们是委托(delegate),但是它们之间的区别以及它们的工作原理是什么?)
而且,在程序中,我没有接电话
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }

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

最佳答案

RelayCommand需要两条信息:

  • 执行命令时应运行什么代码(_execute操作)
  • 应该运行什么代码来确定是否可以执行此命令(_canExecute谓词)
  • Action是代表返回void的方法的委托(delegate)。在这种情况下,_execute操作采用一个参数(object)并返回void
    Predicate是一个接受值并返回 bool 结果的委托(delegate)。在这种情况下,_canExecute谓词采用object值并返回bool

    在构造_execute时,_canExecuteRelayCommand值都将提供给CanExecuteChanged,因为这些是命令的各个部分,它们对于每个单独的命令都是唯一的。

    关于add事件:
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    

    订户订阅事件时,将调用remove,而当他们取消订阅时,将调用CanExecuteChanged。上面的CanExecuteChanged事件只是一个传递事件(即,如果订阅者订阅了CommandManager.RequerySuggested事件,则他们会自动订阅CommandManager.RequerySuggested事件)。根据MSDNCanExecute事件...



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

    关于c# - C#中的RelayCommand,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11286311/

    10-11 13:38