Procedura consigliata per estendere il modello in Visualizza modello

1

Sto affrontando un problema in cui ho un modello per il quale voglio implementare una GUI. Poiché sto esplorando MVVM e WPF, ovviamente utilizzerò un modello di visualizzazione tra la vista e il modello. Avrò anche bisogno di aggiungere coordinate ad alcune classi di modelli che rappresentano oggetti che possono essere trascinati nella GUI. Al momento, questa è l'unica aggiunta a queste particolari classi di modelli di cui ho bisogno. Almeno in questo momento. Allo stesso tempo, quasi tutte, se non tutte, le informazioni contenute negli oggetti del modello sono interessanti per la vista.

Le classi di modelli più importanti sono:

  • Tabella
  • Colonne
  • Dipendenze

  • Le tabelle conoscono le sue colonne.

  • Le colonne sanno a quale tabella appartengono.
  • Le colonne sanno 1 .. * Dipendenze
  • Le dipendenze conoscono 1 .. * colonna rappresenta una dipendenza per.

Ovviamente sarebbe possibile modificare il modo in cui questi oggetti si conoscono, se necessario.

La vera domanda qui però è; Come faccio a rendere le classi modello disponibili per la vista, quando allo stesso tempo aggiungo le coordinate a tabelle, colonne e dipendenze?

Un modo potrebbe essere quello di creare qualcosa del genere:

public class TableViewModel
{
    public Model.Table ModelTable { get; private set; }
    public List<ColumnViewModel> Columns { get; set; }
    public float X { get; set; }
    public float Y { get; set; }
}

Si tratta di un modo preferibile per inoltrare un oggetto Modello "esteso" alla vista o esistono modelli appositamente progettati per questa attività?

L'eredità normale tra gli oggetti in Model e View Model funzionerebbe? Non sono sicuro, però, mi piace l'accoppiamento che potrebbe causare.

O dovrei creare classi del modello di vista che sono adattate per adattarsi alla vista e quindi mappare le proprietà dall'oggetto Model all'oggetto View Model? Questo rimuoverà completamente l'accoppiamento tra View e Model, ma creerà due oggetti in memoria, e in questo caso questi potrebbero essere modelli molto grandi. Il garbage collector lascerà cadere gli oggetti del modello poiché non ci saranno più riferimenti ad essi dopo che sono stati mappati sul modello di visualizzazione?

    
posta Anders 07.11.2015 - 12:26
fonte

1 risposta

3

The real question here though, is; How do I make the model classes available to the View, when at the same time adding coordinates to Tables, Columns and Dependencies?

Il tuo esempio ViewModel dovrebbe andare bene. Un altro modo in cui l'ho visto è con una classe BaseViewModel<T> di cui tutti i ViewModels ereditano e accetta il tipo di modello e quindi lo espone come T Model { get; }

Is this a preferred way to forward an "extended" Model object to the View or are there patterns specifically engineered for this task?

Il ViewModel ha la responsabilità di ottenere qualunque modello / dato e mantenere e modificare qualsiasi stato UI di cui ha bisogno Vista. Il tuo esempio ViewModel sembra adattarsi a questa responsabilità. Tuttavia, userei solo una classe ViewModel all'interno di un ViewModel se sto presentando anche una "vista secondaria" che accompagna ViewModel. Ad esempio, utilizzerei solo List<ColumnViewModel> se dovessi eseguire il looping e aggiungere o includere in modo dinamico un controllo collegato a ColumnViewModel.

Would regular inheritance between the objects in Model and View Model work?

Anche se potrebbe funzionare, ritengo che ereditare ViewModel dal modello sarebbe fonte di confusione. Inoltre, cosa succede se il tuo modello è davvero un elenco di oggetti del modello? In questo caso, l'ereditarietà sarebbe più complicata, in quanto sarebbe necessario rendere la tua classe base un List<Model> e potresti esporre una serie di metodi inutili alla vista. Penso che il wrapping sia un'alternativa migliore.

Or should I create View Model classes that is tailored to fit the View and then map properties from the Model object to the View Model object?

I ViewModels sono generalmente personalizzati per soddisfare le esigenze specifiche di una vista. Tendo a pensare a ViewModels come al code-behind per la vista. La mappatura delle proprietà del modello viene generalmente eseguita tramite il binding nella vista WPF.

Will the garbage collector drop the model objects since there will be no more references to them after they have been mapped to the view model?

Tutto dipende dal tuo contesto, dai riferimenti posseduti dagli oggetti in questione e da una varietà di altri fattori. Generalmente, il tuo modello di visualizzazione dovrebbe avere la stessa durata della tua visualizzazione e questo include i dati. Tuttavia, se vi sono problemi di prestazioni specifici, è sempre possibile cancellare manualmente il modello una volta che è stato caricato.

    
risposta data 10.11.2015 - 10:22
fonte

Leggi altre domande sui tag