2011-06-21 53 views
17

Icommand包含兩種方法一個事件。ICommand的CanExecuteChanged事件

什麼兩種方法做的是明確的,但我不明白什麼事件呢了在ICommand提供。

CanExecuteChanged事件是什麼時候引發的?

下面的解釋是對MSDN但我無法理解它。如果命令管理是 集中指揮作業檢測命令 源的變化可能無效已經提出了一個命令,但不 仍未被命令結合執行

CanExecuteChanged上升。

你能用簡單的術語解釋一下嗎?

感謝......

回答

7

CanExecuteChangedICommandCanExecute方法得到改變

在一些第三方庫升高,如果CanExecute參數養PropertyChanged事件CanExecuteChanged事件也得到提高。例如,如果CanExecute參數引發PropertyChanged事件,而Prism的DelegateCommand則不引發,則MVVM Light Toolkit的RelayCommand會引發CanExecuteChanged事件。

+0

如何在運行時更改'CanExecute'方法?你能否詳細說明.... – Pritesh

+0

@Pritesh,使用謂詞 –

+0

@WingerSendon我看到有一個替代簽名接受對象的謂詞,但不明白你的意思。 –

21

此事件由命令提高到通知它的消費者(即按鈕,菜單項),它的CanExecute屬性可能已經改變。因此,如果焦點從一個文本框移到另一個文本框,您的命令可能需要啓用/禁用。這些信息也需要通過您的命令傳遞給任何控件。

一般而言,此事件只是重新呈現CommandManager.RequerySuggested事件。從類的RoutedCommand:

public event EventHandler CanExecuteChanged { 
    add { 
     CommandManager.RequerySuggested += value; 
    } 
    remove { 
     CommandManager.RequerySuggested -= value; 
    } 
} 

的RequerySuggested事件被觸發很多時候,作爲焦點移動,文本選擇改變。這也可以通過撥打InvalidateRequerySuggested手動提出。

+0

我有一個刪除命令,從datagrid中刪除行,當我將焦點從datagrid移動到TEXTBOX時,它不會觸發'CanExecuteChanged',正如您所說的...我已經將兩個書籤放在ADD和REMOVE塊中,但可以在那個位置沒有指針... – Pritesh

+0

@Pritesh - 你必須發佈你的代碼。如果使用您的命令的元素不可見,則不需要查詢您的命令。一般來說,只有在CanExecute狀態更改時才能觸發該事件。 WPF將它推廣到僅僅在他們認爲CanExecute可能已經改變(即改變焦點,選擇改變等)時引發事件。 – CodeNaked