2010-08-22 28 views
3

使用我讀約什 - 史密斯」 WPF Apps With The Model-View-ViewModel Design Pattern教程需要幫助理解MVVM教程,RelayCommand&lambda表達式

我不明白下面的代碼試圖做的事。
首先,該語法提醒我屬性,但用添加/刪除來代替。

但什麼是CommandManager.RequerySuggested

它代表事件訂閱 的CommandManager.RequerySuggested 事件。這確保了WPF 指揮基礎設施要求所有 RelayCommand對象,如果他們能 執行時,它會詢問內置 命令

//Figure 3 The RelayCommand Class 
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 } 

另外,保存命令配置了lambda表達式。第一,有2個參數變量。 他們會衝突嗎?我不能只是像RelayCommand(this.Save(), this.CanSave)那樣做,或者是沒有這樣的語法。

_saveCommand = new RelayCommand(param => this.Save(), 
           param => this.CanSave); 
+0

這可以幫助你。 http://stackoverflow.com/questions/2281566/is-josh-smiths-implementation-of-the-relaycommand-flawed – 2010-08-25 09:41:06

回答

3
  1. CommandManager.RequerySuggested += value意味着,如果CanExecute功能可以解決這兩個truefalse取決於一些條件。

    如果WPF的評估結果爲false,並且在條件評估結果爲true時啓用,則WPF將禁用Button/MenuItemCommandButtonBase)。
    如果你沒有這兩條線,WPF會問命令只有一次(當按鈕/菜單項被加載,除非你做手工,不會後更新。

  2. 兩個參數(拉姆達表達式)是Action<object>型和A Predicate<object>所以,他們不能,根據定義,衝突(params只是一個名字 - 和兩個功能有不同的範圍 - 他們不衝突)

    如果。你有一個正確的簽名方法,你可以在構造函數中使用它

    • private void Save(object obj)

      private bool CanSave(object obj)

    分別,但你不應該有()末 - 所以新RelayCommand(this.Save,this.CanSave)應該工作。

+0

1我不明白'CanExecuteChanged'是添加/刪除。它看起來像我一個getter/setter,當我爲'CanExecuteChanged'添加事件處理程序時,我也將它添加到'CommandManager.RequerySuggested'事件中。刪除相同?但你說價值可以評估爲真/假。那麼實際上添加/刪除是什麼?同樣假設value是bool,那麼'CommandManager'如何知道禁用哪個控件? – 2010-08-23 01:54:48

+0

添加/刪除是每次添加命令時發生的事情.CanExecuteChanged + = SomeRoutine(當然是 - =)。所以,每次WPF引擎都會向命令添加一個處理程序(這是將它添加到後臺的按鈕的Command屬性時發生的情況),我們向CommandManager添加一個鉤子 - 該鉤子包含值(即按鈕)和命令 - 然後當CommandManager決定足夠改變時,CanExecute可能會不同 - 它告訴Button向Command詢問新的CanExecute - 從而取消/啓用按鈕。 – Goblin 2010-08-23 07:33:02