Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的RelayCommand#_C#_Silverlight_Mvvm_Delegates_Icommand - Fatal编程技术网

C# C中的RelayCommand#

C# C中的RelayCommand#,c#,silverlight,mvvm,delegates,icommand,C#,Silverlight,Mvvm,Delegates,Icommand,我正在学习C#Silverlight开发的MVVM 我对上下文中提到的RelayCommand类感到困惑。代码是: public class RelayCommand : ICommand { #region Fields readonly Action<object> _execute; readonly Predicate<object> _canExecute; #endregion // Fields #region Constructor

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

我对上下文中提到的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
}

谁能给我解释一下,谢谢

A
RelayCommand
需要两条信息:

  • 执行命令时应该运行什么代码(执行操作)
  • 应该运行什么代码来确定是否可以执行此命令(
    \u canExecute
    谓词)
  • 操作
    是代表返回
    void
    的方法的委托。在这种情况下,
    \u execute
    操作接受一个参数(一个
    对象
    )并返回
    void

    谓词是接受值并返回布尔结果的委托。在这种情况下,
    \u canExecute
    谓词接受一个
    对象
    值并返回一个
    bool

    \u execute
    \u canExecute
    值在构建时都会提供给
    RelayCommand
    ,因为它们是每个单独命令所特有的命令部分

    关于
    CanExecuteChanged
    事件:

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    
    当订阅者订阅事件时,调用
    add
    ,当订阅者取消订阅时,调用
    remove
    。上述
    CanExecuteChanged
    事件只是传递事件(即,如果订阅者订阅
    CanExecuteChanged
    事件,他们会自动订阅
    CommandManager.RequerySuggested
    事件)。根据,
    命令管理器.RequerySuggested
    事件

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


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

    添加/删除类似于属性get/set,而不是事件。添加代码将在以下情况下调用:

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

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

    RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler