2010-09-18 17 views
5

MVVM non consente il codice e quindi la gestione degli eventi. Quindi qual è il modo MVVM di essere avvisato che una cella è stata cambiata?Come gestire l'evento Wpf DataGrid CellEditEnding in MVVM?

+0

Sembra una domanda legittima per me, ma forse devi essere un po 'più prolisso con la tua domanda: cosa non capisci esattamente sulla gestione di quell'evento? Vuoi sapere se dovrebbe essere fatto nella view o nel viewmodel? * (Ecco un suggerimento: il ViewModel non dovrebbe sapere nulla di DataGrid). * – slugster

+0

@slugster - Ovviamente non posso usare questo evento poiché MVVM non consente il codice dietro. Quindi la mia domanda è cosa posso fare invece di usare questo evento? – Erez

+2

MVVM non * vieta * il codice dietro, semplicemente * lo scoraggia * e vi offre uno schema per raggiungere quell'ideale. Che cosa devi fare esattamente una volta che la cella datagrid viene cambiata (la tua risposta potrebbe dettare l'approccio da adottare)? – slugster

risposta

1

È una domanda piuttosto legittima e ovvia poiché ci sono soluzioni piuttosto legittime al problema per MVVM. Suppongo che qualcuno l'abbia annotato perché probabilmente è stato chiesto innumerevoli volte prima.

So che c'è qualcosa di integrato nel fare questo in .Net4. Sono bloccato a .Net3.5, quindi utilizzo la classe CommandReference dal toolkit WPF per convertire un evento nella vista in un comando in un modello view.

+0

La soluzione al problema di MVVM è gestire l'evento, credo. :) –

+0

Ma "come" è la domanda !! Non è possibile aggiungere gestori di eventi senza interrompere MVVM. Il riferimento ai comandi consente di convertire un evento nell'interfaccia utente in un comando nella VM. – NVM

0

È necessario gestire l'evento CellEditEnding? Sarebbe una possibilità di eseguire il codice nel setter della proprietà che è legato alla cella?

-1

"MVVM non consente il codice e quindi la gestione degli eventi."

Whoops! C'è il problema.

MVVM scoraggia codice dietro, è vero, ma solo quando qualcosa può essere fatto ragionevolmente tramite Xaml. "Non sarai un codice dietro" non è mai stato detto da nessuno con la minima idea.

A volte gestire un evento è il modo più semplice e migliore per raggiungere l'obiettivo. Quando questa è la situazione, accettala, risolvi il problema e vai avanti. A volte non è nemmeno possibile raggiungere il tuo obiettivo in XAML. In questi casi, lancia la logica della vista nel code-behind della vista e vai avanti.

È molto più importante mantenere gli obiettivi architettonici di MVVM (separazione delle preoccupazioni tra i livelli) piuttosto che rispettare rigorosamente le regole del pollice (come evitare code-behind). Se tale distinzione non viene fatta , ti manca la foresta per gli alberi.

+0

Bene, hai ragione e ti sbagli. Se stai aggiungendo del codice solo per aver fatto cose puramente dell'interfaccia utente, va bene. Ma dì se l'evento finale di modifica della cella aggiorna qualcosa nel tuo modello (tramite la tua VM), allora è una pessima idea (IMO). – NVM

+0

Dipende da quanto bene il vostro modello deve lavorare in un DataGrid. In una situazione che ho @work in questo momento, ad esempio, sono costretto a utilizzare un datagrid a riga singola per rappresentare un singolo elemento.La VM non ha intenzione di esporre una raccolta di questi elementi che possono contenere solo un'istanza, sarebbe una concessione ridicola sul lato VM per un req't strano nel V. Piuttosto, la V è responsabile della trasformazione ciò che la VM espone come una vera e propria applicazione ha bisogno di ciò che richiede. –

+0

Non sono sicuro di capire qual è il tuo scenario. Ma non sono d'accordo con l'affermazione che "la visione è responsabile della trasformazione di ciò che la VM espone". La vista è responsabile per 'mostrare' ciò che la VM espone. La VM è responsabile della trasformazione del modello. Una vista dovrebbe richiedere alla VM di trasformare le cose nel modello in base alla richiesta degli utenti. Il punto di vista non ha alcun business che trasforma qualsiasi cosa nel modello è completamente responsabilità della VM. E la VM esiste proprio perché i modelli non sono direttamente adatti alle viste di lavoro (come datagridview). – NVM

0

Poiché non è mai stata indicata una risposta a questa domanda; quello che vuoi è un'implementazione di "evento da comandare". Fondamentalmente, cattura un evento di tua scelta e chiama un'implementazione ICommand sul ViewModel.

Già risposto here in sintesi (verificare risposta di Derek Beattie).