2013-05-02 17 views
5

Sono nuovo in C#, WPF e MVVM. Scusa per questo post piuttosto lungo, sto cercando di impostare tutti i miei punti di comprensione (o non comprensione).Principi di comandi e MVVM - RelayCommands

Dopo aver studiato un sacco di testi sul meccanismo di comando fornito da WPF e il pattern MVVM, ho alcuni problemi a pensare direttamente a come utilizzare queste cose.

Capisco che i comandi forniti per WPF consentono di definire più "punti di chiamata" per la logica di comando che è contenuta in un componente dell'albero visivo. Quando viene chiamato un comando, la chiamata esplode attraverso l'albero visivo (a partire dalla destinazione del comando o dall'elemento focalizzato) fino a quando non incontra un elemento che contiene un CommandBinding che definisce dove si trova la logica del comando.

Ciò che sembra bello è che è possibile definire comandi pubblici senza prima specificare né la logica né i punti di chiamata.

Capisco anche che seguendo il modello MVVM, il ViewModel di una vista dovrebbe gestire la logica mentre l'implementazione di comandi WPF di base consente solo agli elementi visivi di gestirla perché la chiamata bolle attraverso l'albero visivo.

Ho quindi trovato che le implementazioni personalizzate come RelayCommand di Josh Smith possono essere utilizzate in questo caso, poiché si associa un comando chiamato da un elemento della vista (pulsante per esempio) all'oggetto RelayCommand nel ViewModel sottostante.

Tuttavia, non vedo più come sia un comando (in base alla definizione del modello di comando WPF) poiché stiamo specificando direttamente un'implementazione a cui viene fatto riferimento nel ViewModel. Con questo metodo, perdiamo tutti i vantaggi di poter chiamare un comando da qualsiasi luogo senza sapere dove viene implementata la logica. In questo caso, perché non utilizzare direttamente un gestore di eventi Click (ad esempio)?

Qualcuno potrebbe spiegarmi dove ho sbagliato? (grazie per coloro che hanno letto il post fino alla fine!)

Saluti. NR

risposta

4

Ma poi, non vedo come sia un comando (nella definizione di WPF comandare modello) più dal momento che stiamo specificando direttamente un'implementazione che viene fatto riferimento nel ViewModel.

Questo è ancora un comando e implementa ICommand, ma non è più sfruttando le strategie di routing integrate in WPF. È un comando, ma non è più un RoutedCommand - quindi, in un certo senso, hai ragione - non sta seguendo i concetti originali dell'infrastruttura di comando routed di WPF, ma è pur sempre un comando.

Con questo metodo, perdiamo tutti i vantaggi di poter chiamare un comando da qualsiasi luogo senza sapere dove viene implementata la logica. In questo caso, perché non utilizzare direttamente un gestore di eventi Click (ad esempio)?

Stai ancora mantenendo i vantaggi di separare la logica dalla vista. La vista non ha bisogno di sapere come è implementata e ViewModel può implementare il comando senza sapere come la visualizzerà. Il comando può ancora provenire da un gesto, un pulsante, ecc. E può essere modificato (completamente all'interno di XAML), senza modificare la logica e il codice.

Il passaggio al gestore eventi si interrompe: se si utilizzano gestori di eventi, la modifica dell'implementazione della vista richiede l'aggiornamento dei gestori di eventi (codice retrostante).

+0

Ottima risposta. Anch'io sono nel mezzo dell'apprendimento del WPF e lo trovo piuttosto difficile. Puoi commentare come si può usare la logica contenuta in un comando chiamato da un altro metodo? Suppongo che in questo caso dovresti scrivere un metodo con la logica appropriata e chiamarlo anche dal comando? Grazie per il tuo tempo. – MoonKnight

+2

@Killercam In generale, ogni "metodo" che si desidera chiamare viene incapsulato all'interno di un solo 'ICommand' - è possibile avere un 'ICommand' che compone solo più metodi, tuttavia (proprio come avere un metodo che chiama il metodo> 1). –

+0

Grazie mille per il tuo tempo. – MoonKnight

0

Dopo alcune ulteriori ricerche su come utilizzare il comportamento del comando WPF originale in un progetto MVVM, ho trovato questo collegamento: http://matthamilton.net/commandbindings-with-mvvm!

Da quello che ho capito, fornisce un modo per "allegare" alla vista, CommandBindings gestito da viewmodel. In questo modo, il viewmodel sarebbe in grado di implementare una combinazione di comandi che verrebbe scoperta quando la chiamata al comando percorre l'albero visivo.

Ciao.