2013-03-06 11 views
5

Ho visto tutorial in cui le persone stanno creando metodi come CanExecute nel loro codice. Presumo che lo stiano facendo per aiutare il lettore a capire come funziona. Quando cerco Command e ICommand, mi porta alla classe ICommand su MSDN che viene utilizzata per le app di Windows Store. Non c'è una classe Command per WPF?Comandi in MVVM

risposta

8

L'implementazione integrata di ICommand in WPF è RoutedCommand (e sua sorella RoutedUICommand). RoutedCommand funziona così:

I Execute e CanExecute metodi su un RoutedCommand non contengono la logica di applicazione per il comando come è il caso con un tipico ICommand, ma piuttosto, questi metodi generano eventi che attraversano la elemento albero alla ricerca di un oggetto con un CommandBinding. I gestori di eventi collegati a CommandBinding contengono la logica di comando.

Il problema di questo è che questi gestori di eventi devono essere attaccati al code-behind per il vostro vista, che è esattamente ciò che si fa non vogliono fare in MVVM.

Esercitazioni in cui si vede CanExecute metodi nel codice (e con questo significano veramente codice al di fuori del ICommand implementazione) utilizzano implementazioni dei comandi personalizzati come DelegateCommand e RelayCommand che sono progettati per "avanti" la loro logica CanExecute/Execute a funzioni fornite al volo; tipicamente, quelli sono metodi sul viewmodel che espone il comando.

Queste implementazioni sono di solito fornite da framework MVVM (per questi due esempi i framework sono rispettivamente Prism e MVVM Light), ma sono veramente semplici (entrambi sono open source, prendi il codice e lo leggi) e non c'è niente che ti fermi da copiare/incollare il codice se non si desidera l'intero framework.

È possibile riepilogare quanto sopra come "lo è integrato in una classe di comando in WPF, ma non è realmente utile nel contesto di MVVM".

+1

Si dovrebbe probabilmente notare, in base a come il nuovo OP è MVVM, che è possibile implementare la propria versione di DelegateCommand molto semplicemente senza dover utilizzare uno specifico framework MVVM. – Thelonias

+0

@Ryan: Grazie, ho apportato alcune modifiche alla risposta e ora riflette il tuo suggerimento. – Jon

+0

Quindi DelegateCommand viene fornito da Microsoft per me da utilizzare? Questa è la mia prima applicazione WPF e la mia prima applicazione MVVM. Anche se ho usato WinForms per un paio d'anni. Finora mi piace davvero WPF! Poiché questa è la mia prima applicazione MVVM, preferirei creare tutto il codice da solo e non utilizzare alcun Framework come MVVM Light in modo da avere una migliore comprensione di come tutto funzioni. – tylerbhughes