2010-09-22 34 views
5

,我用我通過下面的代碼是指在我的XAML RoutedCommands:WPF自定義ICommand的執行情況和我的WPF UI的CanExecuteChanged事件

Command="viewModel:MessageListViewModel.DeleteMessagesCommand" 

我不喜歡這樣的靜態鏈接到我的ViewModel類,我覺得這不是像你一樣創建一個自定義的ICommand實現和使用類似下面的語法

Command="{Binding DeleteMessagesCommand}" 

已經創建了一個,我發現我已經做了什麼一個主要的缺點:RoutedCommands利用命令管理和(在某種程度上,這對我來說是完全不透明的)着火CommandManager.RequerySuggested事件,以便它們的CanExecute方法自動重新查詢。至於我的自定義實現,CanExecute僅在啓動時啓動一次,之後再也不會啓動。

有沒有人有這個優雅的解決方案?

回答

8

只需實現CanExecuteChanged事件如下:

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

當您指定的命令來控制,它訂閱了CanExecuteChanged事件。如果「重定向」它的CommandManager.RequerySuggested事件,每當CommandManager.RequerySuggested觸發控制將被通報。

+0

多謝這個偉大的和簡潔的答覆!奇蹟般有效。你有沒有機會知道何時以及爲什麼RequerySuggested被解僱? – 2010-09-22 11:35:18

+1

不完全,但我似乎經常發生... – 2010-09-22 11:43:57

+0

好的,再次感謝! – 2010-09-22 11:54:57

0

我非常喜歡約束力的視圖模型的DelegateCommand實施棱鏡(http://msdn.microsoft.com/en-us/library/ff654132.aspx)。您可以通過調用RaiseCanExecuteChanged在每個命令調用程序上調用CanExecute()。

簡單的使用例子:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Command = new DelegateCommand<object>(x => CommandAction(), x => CanCommandAction()); 
    } 

    bool state; 

    public void ChangeState(bool value) 
    { 
     state = value; 
     Command.RaiseCanExecuteChanged(); 
    } 

    public DelegateCommand<object> Command {get; private set;} 

    private void CommandAction() 
    { 
     //do smthn 
    } 

    private bool CanCommandAction() { return true == state; } 
} 

//and binding as usual 
Command="{Binding Command}" 
+0

感謝您的想法,但是 - 我們已經學會了 - 「以極大的權力越大,責任越大」 ...... – 2010-09-22 11:53:09

+0

對不起,壓得太很快進入。我的意思是:在給我機會的同時,它也迫使我這樣做,以獲得通知。 – 2010-09-22 11:54:01