Dovremmo associare la vista a una proprietà del modello o ViewModel dovrebbe avere il suo ..?


21

Sto iniziando un progetto con il seguente ambiente tecnico: .Net 4.0, Entity Framework 4.0, WPF con MVVM Architecture

Ho visto molti esempi in rete, alcuni libri con questo ambiente. In alcuni degli esempi gli autori avevano questa idea:

  1. Viemodel avrà un'istanza della classe Model (Entity Framework Entity es. Person)
  2. Associare i controlli della vista WPF alle proprietà del modello

Mentre alcuni autori hanno fatto:

  1. Viemodel esporrà tutte le proprietà del modello.
  2. Associare i controlli della vista WPF alle proprietà di ViewModel piuttosto che al modello direttamente.

Quindi è una buona idea lasciare che la vista associ le proprietà al modello piuttosto che al modello di visualizzazione esponendo le proprie? O quale è più preferito?


Personalmente trovo che esporre le proprietà del modello abbia come risultato una buona separazione del livello dati e dei livelli logici.
Alex Hope O'Connor,

Risposte:


25

Penso che molti programmatori prima provino a prendere la scorciatoia di associazione direttamente al modello, ma nella mia esperienza questo ha alcuni importanti inconvenienti. Il problema principale è che se il tuo modello di entità è persistito da NHibernate o simile, non appena la vista aggiorna la proprietà del modello, NHibernate potrebbe continuare tali modifiche al database. Questo non funziona bene per le schermate di modifica che hanno un pulsante Salva / Annulla. In realtà, può scegliere di aspettare e persistere tutto come un batch, ma l'idea è che quando cambi il modello, stai commettendo il tuo cambiamento.

Quindi, potresti comunque cavartela direttamente con l'associazione alle proprietà del modello nelle schermate di sola lettura, ma poi avrai un'incoerenza.

Inoltre, la maggior parte dei modelli non implementa, INotifyPropertyChangedquindi potrebbero non essere target di associazione adatti se lo stato dello schermo cambia dopo la visualizzazione iniziale.

Data la facilità delle proprietà automatiche, suggerisco di associare sempre la vista al ViewModel, non al modello. È coerente, semplice e ti offre la massima flessibilità per supportare i cambiamenti in futuro.


Mi piace la tua risposta. +1 per menzionare la schermata Modifica / Salva .. Ma sarebbe scoraggiante scrivere le proprietà due volte, una volta nel modello e di nuovo nel modello di visualizzazione. Aumenterebbe anche il tempo di sviluppo. Pensi che sia giustificabile farlo ...?
Pravin Patil,

9
@Pravin Patil - fwiw, ogni volta che ho preso quella scorciatoia, mi sono maledetta più tardi quando ho dovuto tornare indietro e sistemarla. C'è relativamente poco sforzo per implementare nuovamente le proprietà su ViewModel, specialmente se sono di sola lettura (perché è possibile utilizzare le proprietà implementate automaticamente con un setter privato). Il fatto è che nella maggior parte dei casi il modello è una struttura di dati diversa rispetto a ViewModel. Lasciati la flessibilità di cambiare il Modello senza influenzare la Vista. Meno devi cambiare la vista, meglio è, perché la vista è difficile da testare.
Scott Whitlock,

4
@Scott Whitlock: sviluppo applicazioni WPF con NHibernate da due anni ormai e non ho mai avuto problemi legati direttamente al modello. In effetti, quando una proprietà del modello cambia, è per lo più lo stesso sforzo per la modifica, indipendentemente da ciò a cui sei legato. E quando ho davvero bisogno di fare un po 'di routing nel ViewModel stesso in seguito, non valeva la pena investire il tempo prima che ne avessi bisogno. Seguo l'approccio YAGNI (ancora) e non ho difficoltà. Penso che tu e gli altri qui siate un po 'dogmatici su questo problema.
Falcon,

16

Il punto di a ViewModelè che è un modello di View.

Dovresti essere associato ViewModela View, non a nessuna Modelproprietà (non direttamente, comunque).


8

Trovo entrambi i metodi accettabili

Associare solo a ViewModel è l'approccio "purista MVVM" e porta a una migliore separazione tra i livelli. Il collegamento al modello è in genere più veloce e più conveniente.

A meno che non abbia una buona ragione per separare completamente i livelli (dimensioni del progetto, problemi di manutenzione futura, tipo di modello con cui sto lavorando, ecc.), Mi associo al modello.


7

Penso che quello che stai vedendo sia un concetto chiamato bind through, cioè se il tuo modello ha una proprietà chiamata name e il tuo modello di vista espone questa proprietà senza ulteriori modifiche o conversioni, allora puoi collegarti al modello in modo che lo sia.

Codice pseudo:

 {Binding: MyViewModel.MyModel.Name}

Questo viene fatto per ridurre la quantità di proprietà 'Fluff' sul modello di visualizzazione, purtroppo è anche una cattiva idea a lungo termine. Il concetto di un modello di vista è garantire che la vista non abbia una dipendenza dal modello. Legando attraverso di te ora devi assicurarti che il tuo modello contenga una proprietà chiamata name altrimenti l'implementazione si interromperà.

Se si esegue il bind solo per quanto riguarda il modello di visualizzazione, tuttavia, è possibile modificare il modello e la vista non lo saprebbe mai in quanto vedrà sempre la proprietà denominata Nome sul modello di visualizzazione.

Ora questo può essere mitigato in determinate circostanze in cui il modello è basato su un'interfaccia. Quindi se l'interfaccia avesse un IBaseDetails che esponesse la proprietà ModuleName, allora potresti:

Codice pseudo:

 {Binding: MyViewModel.MyModel.ModuleName}

Fintanto che uno qualsiasi dei Modelli realizzati soddisfa l'interfaccia IBaseDetails, il tuo Golden, tieni presente tuttavia che si tratta di un caso limite e in generale sei sempre il 90% migliore per avvolgere il tuo modello di visualizzazione attorno a tutti i modelli che copre.


2

Se vedi molti attriti nel tentativo di passare da Model -> ViewModel, prova qualcosa come AutoMapper. Rimuove manualmente il tedio associato alle proprietà di copia.


1

Sono arrivato qui solo perché avevo lo stesso dubbio e mi sono convinto che mi sarei sempre legato per visualizzare il modello anziché il modello.

Adottare l'approccio della forma reattiva angolare. Si crea un gruppo di moduli utilizzando alcune informazioni del modello di visualizzazione ma in seguito è necessario accedere al modulo. I valori per ottenere i valori e copiarli fanno i valori nel modello usando qualunque auto mapper o manuale, penso che non ci sia nulla di più bello che passare alle proprietà nel modello di vista, diciamo ad esempio che ho una pagina di vista del progetto in cui ho il nome del progetto, nome del cliente, ecc.

Esiste una relazione tra progetto e client poiché un progetto ha un client. Quindi a questo livello, non dovrei preoccuparmi di quella relazione, devo solo mostrare visivamente il nome del progetto e il nome del cliente nella vista, quindi ho inserito 2 proprietà nel nome del progetto del modello di vista e il nome del cliente, quindi associo i controlli della vista a entrambi loro, in seguito mi preoccuperò di dare valori a quelle proprietà nel codice dietro prendendo poi da qualsiasi struttura il modello ha.

Lo stesso potrebbe essere per l'aggiornamento del modello in caso di salvataggio / annullamento non c'è nulla di più pulito.


questo post è piuttosto difficile da leggere (wall of text). Ti dispiacerebbe modificarlo in una forma migliore?
moscerino del

Ecco a voi, salute.
Ivan Carmenates García,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.