Domanda

ho pensato di postare qui nella speranza che forse qualcuno con esperienza MVVM sarebbe in grado di offrire pareri su se la seguente è una buona idea:

Sto usando quadro Cinch MVVM di Sacha Barber, che comprende classe SimpleCommand di Marlon Grech.

Una cosa questa classe non ha che alcuni hanno altre alternative è una proprietà Text, che può essere comunemente utilizzato per legare elementi dell'interfaccia utente per il 'titolo' di funzionamento dei comandi. Di conseguenza, ho scritto una proroga per questa classe, che espone una proprietà Text.

Ora, quello che ho incontrato è un caso d'uso in cui sto utilizzando un comando per attivare o disattivare la connettività a un dispositivo. C'è un sacco di modi diversi ho potuto implementare questo (non ci sono sempre -! Si tratta di un software). Un modo potrebbe essere quello di esporre i molteplici oggetti comando dai miei ViewModel - uno per 'Disconnect' e uno per 'Connect; hanno il modello vista esporre una proprietà che indica lo stato di connessione (IsConnected) e hanno la vista condizionatamente legano sia al comando Collega o comando di disconnessione. La mia reazione a questa opzione, però, è ... bleah!

Quello che inizialmente ho iniziato a guardare invece è stato non solo fornendo una proprietà Text ma anche avere l'oggetto comando implementare INotifyPropertyChanged modo che la proprietà di testo può essere modificato dinamicamente dal ViewModel per 'Connect' o 'Disconnect' a seconda dello stato del sistema. In questo modo, posso evitare di avere più comandi e solo esporre un oggetto singolo comando 'ToggleConnection'.

Partendo questa strada però, viene in mente che ci possono essere altre varianti di questo modello in cui l'interfaccia utente deve essere modificato secondo stato di comando. Ad esempio, oltre a modificare il testo del comando in base allo stato di connessione, si può avere luoghi in cui l'icona ha bisogno di cambiare a seconda dello stato della connessione. Così, ho iniziato a scrivere una classe 'Stateful' che implementa INotifyPropertyChanged, ed espone due proprietà - 'Testo' e 'Stato'. Ho fatto la classe generica in modo che il tipo di Stato può essere definito dall'utente (io di solito preferisco non usare 'oggetto' in cui evitabile).

La domanda che ho è ... Pensi che questa sia una buona o cattiva idea? Esso può essere divergente dall'intenzione / disegno originale di comandi; Da quello che ho visto può in generale essere il caso che comandano gli oggetti erano destinati ad essere senza stato come sono i 'verbi' del sistema. Con i comandi di instradamento, se ho capito le cose correttamente solo la destinazione del comando ci si aspetterebbe di solito ad avere stato. Tanto più che lo stesso comando potrebbe essere indirizzato a diversi gestori a seconda di dove sono dichiarati attacchi di comando.

Quindi, io sto pensando che almeno con i comandi di instradamento, lo stato non avrebbe senso.

Tuttavia, non ho a che fare con i comandi in rotta - Sono in particolare si tratta di comandi MVVM. In questo caso non c'è praticamente instradamento condizionale di comandi -. Il punto di vista MVVM si legano direttamente agli oggetti di comando di un particolare ViewModel ed è eseguire e gestori CanExecute

In questo caso, ha senso?

Ho allegato una copia del codice in questione, nel caso in cui è d'uso / interessi.

Grazie, Phil

È stato utile?

Soluzione

E 'davvero a voi quello che si pensa possa essere più facile lavorare con.

io personalmente non metto la proprietà .Text sui miei comandi, semplicemente perché non ottengo il riutilizzo di questi comandi. E 'diverso con le RoutedUICommands previste nel quadro (o comandi personalizzati statici simili) perché sono riutilizzati ovunque e se la traduzione di "Exit" dovesse cambiare su quel comando, si rifletterebbe in tutta l'applicazione. Questo non è il caso nel tuo esempio -. Tutto sarebbe una tantum

Nel tuo caso questo testo del testo pulsante viene realmente disaccoppiato dal vostro comando (anche se uno influenza l'altro) e quindi è probabilmente andando a finire per essere più semplice e un po 'meno codice per disaccoppiare loro, ma l'isn differenza' t sta per essere più di tanto e si finirà per essere una questione di gusto più che altro.

Sono sicuramente con voi sul 2 comandi cosa - bleah. La maggior parte dei delegati dei pulsanti che scrivete dovranno reagire allo stato in qualche modo (servizio di parlare con è giù, questo dato deve essere popolato in questo modo se l'utente ha selezionato questo, ecc), quindi in realtà non credo che sia sbagliato avere il delegato adattarsi a informazioni stateful sul ViewModel.

In ogni caso, questo è un po 'prolisso ... il take-away è "fare tutto ciò che sente a suo agio".

Altri suggerimenti

Come l'ultimo poster ha detto, "Qualunque cosa sente a suo agio".

Nel mio caso, io di solito uso qualcosa come il DelegateCommand . Se ho bisogno di legarsi ad alcuni dati, mi legano alla VM. Quando viene eseguito il comando, la sua esecuzione nel mio VM (tramite il delegato fornito al DelegateCommand a init). Poi il delegato eseguita può / maynot eseguire del codice riutilizzabile per soddisfare il comando.

Sembra che si desidera utilizzare il comando come il proprio VM. Non ho mai pensato di fare questo prima di me stesso, ma se ci si sente bene a voi, lo faccio! :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top