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

18

Sto avviando 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 esempi gli autori hanno avuto questa idea:

  1. Viemodel avrà un'istanza di classe Model (Entity Framework Entity, ad esempio Person)
  2. Collega 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 anziché al modello direttamente.

Quindi è una buona idea lasciare che la vista leghi le proprietà dal modello piuttosto che viewmodel esponendo il suo? O quale è più preferito?

    
posta Pravin Patil 05.12.2011 - 11:44
fonte

6 risposte

23

Penso che molti programmatori provano prima a prendere la scorciatoia di collegamento direttamente al modello, ma nella mia esperienza questo ha alcuni grossi inconvenienti. Il problema principale è che se il modello dell'entità è persistente da NHibernate o simile, non appena la vista aggiorna la proprietà del modello, allora NHibernate potrebbe mantenere tali modifiche nel database. Ciò non funziona bene per gli schermi di modifica che hanno un pulsante Salva / Annulla. In realtà, può scegliere di attendere e mantenere tutto come un batch, ma l'idea è che quando si modifica il modello, si sta commettendo il cambiamento.

Quindi, puoi sempre ottenere il binding direttamente alle proprietà del modello su schermate di sola lettura, ma in questo caso avrai un'incoerenza.

Inoltre, la maggior parte dei modelli non implementa INotifyPropertyChanged in modo che non possano essere bersagli vincolanti adatti se lo stato della schermata cambia dopo la visualizzazione iniziale.

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

    
risposta data 05.12.2011 - 13:37
fonte
15

Il punto di un ViewModel è che si tratta di un modello di View .

Dovresti legare ViewModel a View , non a nessuna proprietà Model (non direttamente, comunque).

    
risposta data 05.12.2011 - 12:43
fonte
7

Penso che quello che stai vedendo è un concetto chiamato bind-through, cioè se il tuo modello ha una proprietà chiamata name e il tuo modello di visualizzazione espone questa proprietà senza ulteriori modifiche o conversioni, quindi puoi associarti al modello in modo che sarebbe.

Pseudo codice:

 {Binding: MyViewModel.MyModel.Name}

Questo è fatto per ridurre la quantità di proprietà di Fluff sul modello di vista, ma sfortunatamente è anche una cattiva idea a lungo termine. Il concetto di un modello di vista è quello di garantire che la vista non abbia una dipendenza dal modello. Impegnandoti ora devi assicurarti che il tuo modello contenga una proprietà chiamata name altrimenti la tua implementazione si interromperà.

Se si esegue il binding solo per il modello di visualizzazione, tuttavia, è possibile modificare il modello e la vista non lo saprà mai, poiché vedrà sempre solo la proprietà Name sul modello di visualizzazione.

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

Pseudo codice:

 {Binding: MyViewModel.MyModel.ModuleName}

Fintanto che tutti i modelli che fai soddisfano l'interfaccia IBaseDetails, sei d'accordo, tuttavia tieni presente che si tratta di un caso limite e in generale il 90% è sempre meglio avvolgere il tuo modello di visualizzazione attorno ai modelli che copre.

    
risposta data 05.12.2011 - 13:26
fonte
6

Trovo entrambi i metodi accettabili

Associare solo a ViewModel è l'approccio "purificatore MVVM" e porta a una migliore separazione tra i livelli. Legare al modello è solitamente 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 lego al modello.

    
risposta data 30.01.2012 - 17:40
fonte
2

Se stai vedendo un sacco di attriti provando ad andare da Model - > ViewModel, prova qualcosa come AutoMapper. Rimuove il tedio associato alla copia manuale delle proprietà.

    
risposta data 05.12.2011 - 17:38
fonte
1

Sono arrivato qui solo perché avevo lo stesso dubbio e mi sono convinto che avrei sempre associato il modello al modello anziché al modello.

Adotta l'approccio della forma reattiva angolare. Si crea un gruppo di moduli utilizzando alcune informazioni sul modello di vista, ma in seguito è necessario accedere al modulo. Valori per ottenere i valori e copiare i valori nel modello usando qualsiasi auto mapper o manuale Penso che non ci sia più una cosa bella di andare sulle 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 cliente poiché un progetto ha un cliente. Quindi, a questo livello, non dovrei preoccuparmi di questa relazione, ho solo bisogno di mostrare visivamente il nome del progetto e il nome del cliente nella vista, quindi inserisco 2 proprietà nel nome del progetto e nel nome del client del modello della vista, quindi lego i controlli della vista a entrambi loro, più tardi, mi preoccuperò di dare valori a quelle proprietà nel codice che sta dietro prendendo poi da qualsiasi struttura il modello abbia.

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

    
risposta data 04.05.2018 - 17:09
fonte

Leggi altre domande sui tag