Aiuto con MVVM complesso (più viste)

16

Ho bisogno di aiuto per creare modelli di visualizzazione per il seguente scenario:

  1. Dati profondi e gerarchici
  2. Visualizzazioni multiple per lo stesso set di dati
  3. Ogni vista è una singola vista che cambia in modo dinamico, in base alla selezione attiva
  4. In base al valore di una proprietà, visualizza diversi tipi di schede in un controllo struttura a schede

Lemiedomande:

Devocreareunarappresentazionedelmodellodivistaperognivista(VM1,VM2,ecc.)?

1.Yes:a.ShouldImodeltheentirehierarchicalrelationship?(ie,SubVM1,HouseVM1,RoomVM1)b.HowdoIkeepallhierarchiesinsync?(e.g,adding/removingnodes)2.No:a.DoIuseahuge,singleviewmodelthatcatersforallviews?

Eccounesempiodiunasingolavista

Figura1:piùvisteaggiornateinbaseallasalaattiva.Controlloschedanote

Figura 2: stanza attiva diversa. Visualizzazioni multiple aggiornate. Gli elementi di controllo delle schede sono cambiati in base alla proprietà dell'oggetto.

Figura3:Tipodiselezionediverso.Lemodificheallavistaintera

    
posta jayars 16.01.2014 - 10:51
fonte

2 risposte

8

Per rispondere alla domanda, Sì, ogni vista dovrebbe avere il proprio Modello di vista. Ma non è necessario modellare l'intera gerarchia. Solo ciò di cui ha bisogno la vista.

Il problema che ho riscontrato con la maggior parte delle risorse online riguardanti MVVM:

Nella maggior parte degli esempi, la vista è quasi la mappatura 1 a 1 del modello. Ma nel mio scenario, dove ci sono diversi punti di vista per le diverse sfaccettature dello stesso modello, mi trovo bloccato tra due scelte:

Un modello di vista monolitico utilizzato da tutti gli altri modelli di vista

Ounmodellodivistaperognivista

Maentrambinonsonoideali.

IlModelViewMVM(Model-orientedViewModel),mentreilbassonelladuplicazionedelcodice,èunincubodamantenere

IlViewModelViewViewer(VVM)produceclassialtamentespecializzateperognivista,macontieneduplicati.

Allafine,hodecisocheavereunaVMperViewèpiùfaciledamantenereeprogrammare,quindisonoandatoconl'approccioVVM.

Unavoltacheilcodicefunziona,hoiniziatoarefactoringtutteleproprietàeleoperazionicomuninellasuaformaattualeedefinitiva:

In questa forma finale, la classe del modello di vista comune è composta in ogni VVM.

Naturalmente, devo ancora decidere cosa è considerato comune / specializzato. E quando una vista viene aggiunta / unita / eliminata, questo equilibrio cambia.

Ma la cosa bella di questo è che ora posso spingere su / giù i membri da common a VVM e viceversa facilmente.

E una breve nota sulla conservazione degli oggetti durante la sincronizzazione:

Avere un Common View Model si prende cura di gran parte di questo. Ogni VVM può semplicemente avere un riferimento allo stesso modello di visualizzazione comune.

Tendo anche a iniziare con semplici metodi di callback, e evolvendo verso eventi / osservatori se sorge la necessità di più ascoltatori.

E per eventi davvero complessi (ad es. aggiornamenti imprevisti a cascata), passerei all'utilizzo di un mediatore.

Non esido dal codice in cui un bambino ha un riferimento posteriore al suo genitore. Qualsiasi cosa per far funzionare il codice.

E se sorgesse l'opportunità di un refactoring, lo prenderei.

Le lezioni che ho imparato:

  1. Codice brutto / funzionante > Codice bello / non funzionante
  2. È più facile unire più classi piccole, piuttosto che suddividere una grande classe
risposta data 28.01.2016 - 02:58
fonte
2

Osservando i tuoi prototipi, ti consiglio vivamente di creare una gerarchia di ViewModels e molte piccole viste. E molto probabilmente dovrai modellare un bel po 'della gerarchia originale.

Per mantenere le cose in sincronia tra ViewModels, utilizzare entrambi gli eventi o avere proprietà tra loro tra ViewModels. La sincronizzazione tra Views e ViewModels dovrebbe essere la notifica standard delle proprietà.

    
risposta data 16.01.2014 - 13:19
fonte

Leggi altre domande sui tag