6

我正在学习用于 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。我知道它们是代表,但它们之间有什么区别以及它们是如何工作的?)
而且,在程序中,我没有明白这一点

    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }

谁能给我解释一下,谢谢!

4

2 回答 2

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; }
}

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

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

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

于 2012-07-01T23:21:44.767 回答
1

添加/删除类似于属性获取/设置,但用于事件。添加代码将被调用时

RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler 

被执行。执行 -= 时会调用删除代码。您很少看到这种语法,因为您很少需要覆盖从事件调用列表中添加/删除委托的默认行为。

在这种情况下,RelayCommand 只是将其 CanExecuteChanged 事件映射到 CommandManager.RequerySuggested 事件。

于 2012-07-01T23:41:52.400 回答