[英]RelayCommand in C#
我正在學習用於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; }
有人可以給我解釋一下,謝謝!
RelayCommand
需要兩條信息:
_execute
操作) _canExecute
謂詞) Action
是一個委托,表示返回void
的方法。 在這種情況下, _execute
操作接受一個參數(一個object
)並返回void
。
Predicate
是一個委托,它接受一個值並返回一個布爾結果。 在這種情況下, _canExecute
謂詞獲取一個object
值並返回一個bool
。
_execute
和_canExecute
值在RelayCommand
時都提供給RelayCommand
,因為這些是命令的每個命令唯一的部分。
關於CanExecuteChanged
事件:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
當訂閱者訂閱該事件時, add
調用add
,當他們取消訂閱時, remove
調用remove
。 上面的CanExecuteChanged
事件只是一個傳遞事件(即如果訂閱者訂閱了CanExecuteChanged
事件,它們會自動訂閱CommandManager.RequerySuggested
事件)。 根據MSDN , CommandManager.RequerySuggested
事件......
當CommandManager檢測到可能會更改命令執行能力的條件時發生。
我認為,用戶最有可能調用CanExecute
的方法RelayCommand
時觸發此事件,以確定是否仍然可以執行的命令。
添加/刪除就像屬性獲取/設置,但對於事件而言。 添加代碼將在何時調用
RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler
被執行。 執行 - =時調用刪除代碼。 您不會非常看到此語法,因為您很少需要覆蓋在事件調用列表中添加/刪除委托的默認行為。
在這種情況下,RelayCommand只是將其CanExecuteChanged事件映射到CommandManager.RequerySuggested事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.