C# C中的RelayCommand#
我正在学习C#Silverlight开发的MVVM 我对上下文中提到的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
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