È buono per memorizzare i dati della vista all'interno del modello?

0

Sto usando una variante del pattern MVC. Nel mio codice GUI, spesso nasce la necessità di sincronizzare "visualizza dati" (ad es. Elemento selezionato) tra diverse viste.

Ad esempio, immaginiamo un programma di disegno vettoriale. Abbiamo due viste: l'immagine e una lista di tutti gli oggetti (rettangoli, quadrati, ...). L'elemento attualmente selezionato dovrebbe rimanere sincronizzato: se fai clic su "Rettangolo A" in ListView, lo stesso rettangolo dovrebbe essere evidenziato nella vista dell'immagine.

Il modo in cui solitamente lo faccio è avere una classe ViewState contenuta nel mio modello. È una buona idea? In caso contrario, quale sarebbe una soluzione migliore?

class VectorDrawing
{
  List<Object> Items;
  DrawingViewstate Viewstate;
}
class DrawingViewstate
{
  Object SelectedItem;
  event SelectedItemChanged;
}
class ListviewController
{
  ListviewController(VectorDrawing model)
  {
    model.Viewstate.SelectedItemChanged += ... // Subscribe to event
    ...
  }
}
class ImageViewController
{
  ... // similar to the ListviewController
}
    
posta LTR 19.05.2014 - 13:01
fonte

2 risposte

3

Il motivo per cui questa violazione apparente della separazione dei problemi di MVC non è proprio quella, è che nel tuo caso, questo oggetto ViewState non è, in effetti, una parte della Vista dati. Fa parte del modello. Proprio come "l'elenco degli oggetti" fa parte dei tuoi dati, quindi è "l'oggetto attualmente selezionato".

La parte View di questi dati oggetto selezionato potrebbe essere una linea evidenziata in una listbox, o un cambiamento di colore per la forma selezionata sull'area di disegno, ma il fatto che l'identità dell'elemento attualmente selezionato sia usata in più posti e non è solo un artefatto del processo dell'interfaccia utente (ad esempio, la selezione in una listbox come metodo per abilitare il comando "cancella oggetto", ad esempio) è un buon indizio del fatto che è, in effetti, una parte del tuo modello.

    
risposta data 19.05.2014 - 13:17
fonte
1

Penso che tu sia sulla strada giusta.

Considerare l'utilizzo di eventi per notificare le visualizzazioni che una selezione è stata apportata / modificata. Ogni vista può registrare un listener di selezione con il modello e quindi quando la selezione cambia, il modello può notificare alle viste che la selezione è cambiata.

Dissocia una vista richiedendo che un oggetto sia selezionato dalla notifica che è stata selezionata.

    
risposta data 19.05.2014 - 13:11
fonte

Leggi altre domande sui tag