Sto sperimentando il modello MVVM spesso menzionato e in alcuni casi ho avuto difficoltà a definire limiti chiari. Nella mia applicazione, ho una finestra di dialogo che mi consente di creare una connessione a un controller. Esiste una classe ViewModel per la finestra di dialogo, che è abbastanza semplice. Tuttavia, la finestra di dialogo ospita anche un controllo aggiuntivo (scelto da un ContentTemplateSelector
), che varia a seconda del particolare tipo di controller che viene connesso. Questo controllo ha il proprio ViewModel.MVVM: come gestire l'interazione tra ViewModels nidificati?
Il problema che sto riscontrando è che, quando chiudo la finestra di dialogo premendo OK, devo effettivamente creare la connessione richiesta, che richiede informazioni acquisite nella classe ViewModel specifica per Controller interna. Si sta tentando semplicemente di avere tutte le classi ViewModel specifiche del controller che implementano un'interfaccia comune che costruisce la connessione, ma il ViewModel interno dovrebbe davvero essere responsabile di questa costruzione?
La mia domanda generale è: ci sono schemi di progettazione generalmente accettati su come ViewModels dovrebbe interagire tra loro, in particolare quando una macchina virtuale "madre" ha bisogno di aiuto da una VM "bambina" per sapere cosa fare?
EDIT:
sono venuto su con un disegno che è un po 'più pulita di quanto mi è stato originariamente pensato, ma non sono ancora sicuro se è il modo 'giusto' per fare questo. Ho alcuni servizi di back-end che permettono a ContentTemplateSelector di guardare un'istanza di Controller e pseudo-magicamente trovare un controllo da visualizzare per il generatore di connessioni. Quello che mi ha infastidito è che il mio ViewModel di primo livello avrebbe dovuto guardare il DataContext
per il controllo generato e inviarlo a un'interfaccia appropriata, il che sembra una cattiva idea (perché il View DataContext
ha qualcosa a che fare con la creazione ? il collegamento)
finii con qualcosa di simile (semplificando):
public interface IController
{
IControllerConnectionBuilder CreateConnectionBuilder();
}
public interface IControllerConnectionBuilder
{
ControllerConnection BuildConnection();
}
io ho la mia classe ViewModel interna implementare IControllerConnectionBuilder
e il controllore restituisce il ViewModel interiore. Il ViewModel di livello superiore visualizza quindi questo IControllerConnectionBuilder
(tramite il meccanismo pseudo-magico). Mi infastidisce ancora un po 'il fatto che sia il mio ViewModel interno a eseguire l'edificio, ma almeno ora il mio ViewModel di livello superiore non deve conoscere i dettagli sporchi (non sa nemmeno che il controllo visualizzato sta usando un ViewModel).
Sono lieto di ulteriori pensieri se ci sono modi per ripulirlo ulteriormente. Non mi è ancora chiaro quanta responsabilità è "okay" per il ViewModel.
Ci poniamo costantemente questo tipo di domande sul mio lavoro. Hai formulato questa domanda molto bene, quindi spero che tu abbia qualche buon feedback qui. –
Per fortuna questo è un progetto per animali domestici, quindi ho il lusso di esplorare diversi progetti. Il mio negozio non ha adottato WPF o MVVM perché il sovraccarico e l'imbarazzo in questa fase iniziale non sono accettabili per i nostri programmi attuali. Credo fermamente che questa sia una tecnologia che pagherà grandi dividendi in termini di produttività una volta capito come usarla, ma è un tale cambiamento di prospettiva che è difficile sapere dove disegnare le linee in un disegno. –