Domanda

Sto usando il framework MVVM luce così come l'Unità per DI. Ho alcune Visualizzazioni nidificati, ciascuno associato a un corrispondente ViewModel. I ViewModels sono tenuti a di ogni vista DataContext controllo radice attraverso l'idea che ViewModelLocator Laurent Bugnion ha messo in luce MVVM. Questo permette di trovare ViewModels tramite una risorsa statica e per controllare la durata del ViewModels tramite un framework Dependency Injection, in questo caso l'Unità. Essa consente anche di Expression Blend per vedere tutto in materia di ViewModels e come associare loro.

Come ho detto le viste hanno una buona dose di nidificazione, ma i ViewModels non sanno nulla l'uno dell'altro. Una vista primaria si lega al suo ViewModel corrispondenti mediante la risorsa statica ViewModelLocator (che utilizza l'unità per controllare la costruzione e durata dell'oggetto ViewModel). Che vista primaria contiene un controllo utente in esso che è un altro sub-view, che andrà poi a sua corrispondente ViewModel tramite il ViewModelLocator pure. I ViewModels non hanno riferimenti a vicenda o si conosce di gerarchia nei confronti gli uni agli altri.

Quindi, ecco un esempio di come i ViewModels interagiscono tramite messaggi. Ho una vista padre che ha un databound ComboBox a un ObservableCollection nel suo ViewModel. SelectedItem del ComboBox è anche legato (bidirezionale) per una proprietà sul ViewModel. Quando la selezione dei cambiamenti ComboBox, questo è quello di attivare gli aggiornamenti in altre viste e sub-Vista. Attualmente sto realizzare questo attraverso il sistema di messaggistica che si trova in MVVM Luce.

Quindi mi chiedo che cosa la migliore pratica sarebbe quella di ottenere informazioni da una ViewModel ad un altro? In questo caso, ciò che devo tramandare alle sub-ViewModels è fondamentalmente un utente GUID rappresenta l'utente attualmente connesso. La vista più in alto genitore (o meglio, ViewModel) saprà queste informazioni, ma non sono sicuro di come ottenere il basso nelle sotto-ViewModel.

Alcuni possibili approcci mi viene in mente:

  • Se il sub-ViewModel chiedere al ViewModelLocator risorsa statica per un riferimento allo stesso oggetto della genitore View sta usando e accedere al proprietà che modo? Sembra che ViewModels passare attraverso l'altro di proprietà non è molto pulito e coppie insieme inutilmente.

  • sto già utilizzando la messaggistica di notificare i sub-Vista che l'utente selezionato un nuovo elemento nella casella combinata e per aggiornare di conseguenza. Ma l'oggetto tipo che viene selezionato nella ComboBox in realtà non è direttamente relative a questo valore di dati che la sub-Vista hanno bisogno.

È stato utile?

Soluzione 2

Ho deciso di avere i sub-ViewModels pubblicare un messaggio richiede le informazioni necessarie e quindi avere il genitore VM iscriversi a quel tipo di messaggio e token di chiave. Non voglio abusare questo mezzo di comunicazione, ma penso che sarà efficace per un paio di pezzi di dati che sto avendo problemi a trovare modi per spingere verso il basso attraverso la gerarchia View. Fino a questo punto, la maggior parte del passaggio dati sono stati tutti in risposta ad eventi, ma non ogni pezzo di dati possono essere passati in giro in questo modo, soprattutto se i dati vengono acquisiti o l'evento si verifica su uno schermo diverso prima che la nuova vista è anche costruito e leggere per ricevere i dati.

ho avuto una conversazione Twitter con alcuni nomi ben noti in questo spazio (Glenn Block, Giovanni Papa, e Rob Eisenberg). Hanno suggerito un certo numero di cose come un modello visitatore, ma non ero sicuro che avrebbe funzionato così bene, senza una gerarchia di macchine virtuali. Questo potrebbe essere perché il mio disegno è praticamente stata vista in primo luogo, al contrario di un ViewModel-primo approccio. Un altro suggerimento che potrebbe essere stato praticabile potrebbe essere quella di modificare la mia iniezione di ViewModelLocator e Dipendenza per includere la capacità di passare nei valori dei dati al sub-VM al momento della creazione. Ho avuto un po 'di problemi a immaginare a causa della staticità del VML, e ha deciso la soluzione richiesta di messaggio mi è venuta sarebbe più dritto in avanti e semplice per il momento. Io probabilmente ripensare la soluzione se non ci finisce per essere troppo molti più dati che rientrano in questa situazione.

Altri suggerimenti

Ho visto fondamentalmente due approcci a questo. Per la comunicazione generale cross-VM il modello di evento aggregatore funziona alla grande.

Per gerarchie di macchine virtuali che utilizzano invece un modello di visitatore può essere migliore. Con un visitatore è possibile avere le informazioni che scorre attraverso la gerarchia, per esempio dando ad ogni bambino un riferimento al genitore VM automaticamente.

È anche possibile fare questo con EA, ma la sfida è di circa il passaggio di informazioni sufficienti nel payload del messaggio in modo tale che i bambini sanno che è qualcosa che dovrebbe preoccuparsi.

Per quanto riguarda la VM locator, assolutamente no! La roba localizzatore VM è stricly per il legame nell'interfaccia utente non dovrebbe superficie stessa al di fuori di quel contesto (in modo ottimale).

Il mio $ .02 Glenn

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