2009-06-04 13 views
18

Quando si crea un'applicazione WPF con il pattern MVVM, , sembra che sia necessario raccogliere gli strumenti necessari da me per iniziare anche la gestione degli eventi più rudimentale, ad es.Perché gli eventi e i comandi in MVVM non sono supportati da WPF/Visual Studio?

  • AttachedBehaviors che ricevo da here
  • DelegateCommands che ricevo da here

Ora sto in cerca di un modo per gestire l'evento itemSelected in un ComboBox e sono sempre i suggerimenti di trucchi e soluzioni alternative per eseguire questa operazione (utilizzando un trigger XAML o altri elementi associati all'elemento selezionato, ecc.). Ok, posso percorrere questa strada, ma sembra che stia reinventando la ruota. Sarebbe bello avere solo un comando ItemSelected che posso gestire nel mio ViewModel.

Mi sto perdendo un insieme di strumenti standard o è tutti facendo MVVM con WPF fondamentalmente costruire e mettere insieme la propria collezione di strumenti solo in modo che possano fare i compiti idraulici più semplici con eventi e comandi, le cose che richiedono solo un accoppiare le code in code-behind con Click = "eventHandler"?

+7

Devo ammettere che WPF manca davvero un set di funzionalità per MVVM ... Sarebbe bello se Microsoft potesse fornire una sorta di toolkit MVVM "ufficiale"! –

risposta

7

Secondo Josh Smith di article su MVVM, è stato svelato al mondo nel mese di ottobre 2005 sul John Gossman's blog.

Da quel momento in poi ci sono voluti altri 2-3 anni perché WPF/MVVM decollasse e venisse accettato dalla comunità, quindi era troppo tardi per aggiornare WPF per supportare i problemi con MVVM. Inoltre, direi che WPF ha creato MVVM, quindi sembra che le versioni precedenti di WPF cambino per supportare MVVM.

Infine, non tutti facendo WPF utilizza MVVM, quindi l'API deve supportare l'utilizzo standard di eventi ecc

Quindi, per rispondere alla tua domanda, sì ognuno sta mettendo il proprio set di strumenti insieme come " il supporto "ufficiale" fornisce al momento il framework DelegateCommands.

+2

lol, adoro questa idea di "svelare" un "pattern" come se fosse un prodotto – Schneider

+2

È un peccato Microsoft non rilascia qualcosa per MVVM esplicito come hanno fatto con ASP.NET MVC. – Kelly

0

Dai un'occhiata a questo modello di progetto MVVM per VisualStudio.

http://blogs.msdn.com/llobo/archive/2009/05/01/download-m-v-vm-project-template-toolkit.aspx

Con questo modello si ottiene varie classi DelegateCommand che coprono esigenze diverse per ICommands, e una classe CommandReference che aiuta con combinazioni di tasti.

E 'un buon inizio ...

+0

sì, questo è quello che ho collegato sopra a DelegateCommands, ho preso quel progetto, ho apportato alcune modifiche e aggiunto AttachedBehaviors e ho creato questo template MVVM http://tanguay.info/web/index.php?pg=codeExamples&id=195 che Io uso quando faccio MVVM, ma non è ancora abbastanza quando voglio qualcosa di semplice come ad es gestire un evento ItemSelected su un Combobox. Continuerò ad aggiungere a questo come ottengo gli strumenti MVVM ma sarebbe bello trovare altri tentativi di raccolte come questa che estendono il modello VS MVVM. –

2

Becco MVVM è stato "inventato" modo dopo WPF ... quindi perché pezzi grandi del puzzle MVVM non fanno parte del framework WPF.

Non solo, ma MVVM stesso è stato dichiarato un "modello" prima ancora che fosse provato/praticato nel mondo reale. Qual è l'esatto contrario di ciò che sono gli schemi? Di solito sono individuati e documentati dopo il molti anni di utilizzo di successo da parte di molte persone diverse.

Un tizio che si presenta con un modello non fa un modello.

+0

Non potrei essere più d'accordo. C'è fretta di essere sul carro della band, e nel caso di MVVM come parte di XAML non ne sono convinto. Avrei bisogno di vedere qualche serio codice di produzione. –

+2

A meno che non si tratti di Jon Skeet, e il modello in questione è quello del calcio di testa. – Alan

16

Hai ragione riguardo la complessità dei comandi.Cerco di seguire il modello M-V-VM il più vicino possibile, ma non posso giustificare soluzioni alternative sofisticate solo per gestire un semplice evento utente.

A mio parere, è corretto gestire un evento utente nella vista se questo semplifica notevolmente il codice. Se gestisci un evento utente nella vista, il code-behind della tua vista dovrebbe chiamare immediatamente un metodo su ViewModel. In questo modo, stai mantenendo la tua logica nel ViewModel ... hai solo un piccolo codice idraulico (gestore di eventi) nella Vista. So che i puristi di M-V-VM pensano che non ci dovrebbe essere codice nel code-behind di View, ma a volte ha solo più senso consentire un semplice codice standard come un gestore di eventi. Ricorda, altri potrebbero dover leggere/modificare il tuo codice in futuro ed è molto più facile capire un gestore di eventi che un DelegateCommand.

+6

+1 per essere un programmatore pragmatico. Se si inoltrano le chiamate dai metodi di gestione degli eventi nel codice sottostante, si ha la separazione delle preoccupazioni senza bisogno di soluzioni alternative. – dthrasher

+0

+1 Punto valido: preferirei questo approcare ogni giorno e scrivere codice ridondante solo per convertire eventi in comandi. –

+0

FWIW, codebehind è in genere più semplice e più semplice quando si ha un singolo comando in un singolo posto che deve essere eseguito. I comandi iniziano ad essere più allettanti quando è necessario disporre di un CanExecute (anche se non è essenziale, aiuta a raggruppare la logica insieme più dell'alternativa). Dove i comandi diventano veramente superiori è quando si ha la stessa azione in più punti (pulsante/menu/barra degli strumenti/ecc.) O se si desidera decorare globalmente comportamenti aggiuntivi come la registrazione dell'interfaccia utente o le autorizzazioni dell'utente. Ma se il tuo caso d'uso è semplice, potrebbe non valerne la pena. – Miral

3

Felice di non essere l'unico a pensare che le implementazioni di comando disponibili siano overkill. Il Databinding sembra naturalmente ben supportato, ma da settimane mi batto la testa cercando di capire i binding dei comandi per cose diverse dai pulsanti e dagli elementi che ne ereditano.

Grazie per aver postato questa domanda. Penso che d'ora in poi gestirò tutti gli eventi nel livello vista con un reindirizzamento alle funzioni del modello di vista. Penso che questo è il modo in cui hanno insegnato MVVM di base in uno dei corsi XAMLFest di 2 giorni di Microsoft. Abbastanza buono per me!

Problemi correlati