2009-07-16 44 views
45

讓我們有一個按鈕Command綁定到自定義命令的屬性。WPF ICommand vs RoutedCommand

什麼時候應該執行ICommand以及何時從RoutedCommand派生?我看到RoutedCommand實現了ICommand

在哪種情況下我需要補充ICommand? MVVM模型呢?哪一個更適合這個目的?

回答

63

正如您已經注意到了RoutedCommand classICommand接口的實現,其主要區別,如果它的功能類似於一個RoutedEvent

的執行和對的RoutedCommand CanExecute方法不包含命令的應用程序邏輯與典型的ICommand相同,但是,這些方法會引發遍歷元素樹的事件,以尋找具有CommandBinding的對象。連接到CommandBinding的事件處理程序包含命令邏輯。

Execute方法引發了PreviewExecuted和Executed事件。 CanExecute方法引發了PreviewCanExecute和CanExecute事件。

在當你不想要的RoutedCommand你會看着自己實現ICommand行爲的情況。至於MVVM模式,我不能說一個解決方案,似乎每個人都有自己的方法。但是,這裏有一些方法解決這個問題,我已經遇到:

+0

很好的答案。 +1 – micahtan 2009-07-16 12:41:21

22

唯一我要添加到Rich McGuire的答案是RoutedCommands(和他們更普遍的後裔RoutedUICommand必須與事件處理程序連線才能正常工作。

我遇到過的大多數MVVM實現嘗試利用對ViewModel的綁定,因此ViewModel(而不是View)擁有CanExecute/Execute邏輯。

相比之下,事件處理程序將該負擔移至視圖。然後可以將處理傳播到ViewModel,但這意味着ViewModel和View之間的耦合程度稍高(轉換+方法調用等)。