2009-07-16 16 views
45

Diamo una proprietà del pulsante Command legato a un comando personalizzato.WPF ICommand vs RoutedCommand

Quando devo implementare ICommand e quando derivano da RoutedCommand? Vedo che RoutedCommand implementa ICommand.

Nel qual caso potrei bisogno di iplement un ICommand? E il modello MVVM? Quale si adatta meglio a questo scopo?

risposta

63

Come avete notato la RoutedCommand class è un'implementazione dell'interfaccia ICommand, la sua distinzione principale se che la sua funzione è simile a quella di un RoutedEvent:

La eseguire e metodi CanExecute su un RoutedCommand non contengono la logica dell'applicazione per il comando, come nel caso di un tipico ICommand, ma piuttosto, questi metodi generano eventi che attraversano l'albero degli elementi alla ricerca di un oggetto con CommandBinding. I gestori di eventi collegati a CommandBinding contengono la logica di comando.

il metodo execute solleva la PreviewExecuted e gli eventi eseguiti. Il metodo CanExecute genera gli eventi PreviewCanExecute e CanExecute.

In un caso in cui non si desidera che il comportamento del RoutedCommand sarete alla ricerca di una propria implementazione di ICommand. Per quanto riguarda il pattern MVVM non posso dire che una soluzione, sembra che ognuno abbia una propria metodologia. Tuttavia, qui ci sono un paio di approcci a questo problema che ho incontrato:

+0

Buona risposta. +1 – micahtan

+0

Grazie. Penso che la cosa più importante da capire è che attraversano l'albero alla ricerca di un oggetto con CommandBinding. Come in MVVM voglio evitare CommandBindings, decido per ICommand. –

22

L'unica La cosa che aggiungerei alla risposta di Rich McGuire è che i RoutedCommands (e il loro discendente più diffuso RoutedUICommand devono essere cablati con gli event handler per funzionare correttamente.

La maggior parte delle implementazioni MVVM che ho incontrato tentano di sfruttare l'associazione con ViewModel e quindi ViewModel (e non la vista) possiede la logica CanExecute/Execute.

Al contrario, i gestori di eventi spostano tale carico sulla vista. La gestione può quindi essere propagata al ViewModel, ma ciò significa un grado leggermente più elevato di accoppiamento tra ViewModel e View (casting + metodo call, ecc.).

Problemi correlati