簡體   English   中英

C#中的RelayCommand

[英]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需要兩條信息:

  1. 執行命令時應運行什么代碼( _execute操作)
  2. 應該運行什么代碼來確定是否可以執行此命令( _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事件)。 根據MSDNCommandManager.RequerySuggested事件......

當CommandManager檢測到可能會更改命令執行能力的條件時發生。

我認為,用戶最有可能調用CanExecute的方法RelayCommand時觸發此事件,以確定是否仍然可以執行的命令。

添加/刪除就像屬性獲取/設置,但對於事件而言。 添加代碼將在何時調用

RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler 

被執行。 執行 - =時調用刪除代碼。 您不會非常看到此語法,因為您很少需要覆蓋在事件調用列表中添加/刪除委托的默認行為。

在這種情況下,RelayCommand只是將其CanExecuteChanged事件映射到CommandManager.RequerySuggested事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM