我正在从中学习用于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
时,_canExecute
和RelayCommand
值都将提供给CanExecuteChanged
,因为这些是命令的各个部分,它们对于每个单独的命令都是唯一的。关于
add
事件:public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
订户订阅事件时,将调用
remove
,而当他们取消订阅时,将调用CanExecuteChanged
。上面的CanExecuteChanged
事件只是一个传递事件(即,如果订阅者订阅了CommandManager.RequerySuggested
事件,则他们会自动订阅CommandManager.RequerySuggested
事件)。根据MSDN,CanExecute
事件...我相信,触发此事件以确定该命令是否仍然可以执行时,订阅者很可能会在
RelayCommand
上调用ojit_code方法。关于c# - C#中的RelayCommand,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11286311/