2009-06-08 4 views
11

sto cercando di capire l'approccio di base di progettazione MVVM quando si utilizza ItemsControl legandosi via DataTemplates a ObservableCollections sul ViewModel.Il mio ViewModel dovrebbe avere ObservableCollection of Views o ViewModels?

Ho visto esempi che si legano a ObservableCollections di stringhe, Visualizzazioni e ViewModel.

Binding in stringhe sembra essere solo per demo, è il legame a "ViewModels che contengono collezioni di viste che contengono raccolte di ViewModels" che il potere di WPF sembra venire davvero fuori.

Per quelli di utilizzo abile nel modello MVVM, qual è il vostro approccio standard per il binding di ItemsControl, ListView, ListBox alle raccolte in un ViewModel? Sto cercando consigli da un'esperienza come questa:

  • utilizzare sempre ObservableCollection < ...> e mai Elenco Questo < ...> perché ...
  • qualcosa di meglio di ItemsControl per visualizzare una collezione è ...
  • al fine di ottenere il filtraggio a lavorare nel vostro ViewModel, invece di code-behind, uso ...
  • collezioni uso di Vista quando ... e le collezioni di ViewModels quando ...
  • 90% del tempo creo un ItemsControl e lo lego a un O bservableCollection of Views che hanno i propri ViewModels ...

risposta

10

si usa un ObservableCollection di ViewModels per i seguenti motivi:

  • ObservableCollection ha già eventi disponibili per segnalare quando è stato modificato (ad esempio quando si aggiungono oggetti/rimosso dalla raccolta).
  • Siamo a livello ViewModel in modo da fornire una separazione più pulita per avere un ViewModel contenere una raccolta di ViewModels piuttosto che Views
  • Se è necessario modificare o ottenere dati da elementi all'interno della raccolta è possibile più facilmente modifica/acceda a quei dati se gli oggetti sono ViewModels (se sono viste, spesso si esegue il casting del DataContext della vista o si accede agli elementi dell'interfaccia utente).
+0

utile, grazie –

+0

+1, questa è sicuramente la strada da percorrere. your viewmodel ha collezioni di viewmodels e la collezione di risorse della tua vista ha datatemplates per ciascuno di quei modelli di vista. –

1

Mi piace usare una ObservableCollection di ViewModels. La vista che si lega alla collezione può definire un DataTemplate che conferisce a ViewModel il suo aspetto. Ciò porta ad un minore accoppiamento tra i componenti.

+0

Se si dispone di ObservableCollection di ViewModels (anziché di Views), qual è la differenza tra avere XAML nel DataTemplate e avere XAML il file .xaml di una vista? –

1

Ho la stessa domanda, ma sostituire la "vista" con "modello". :)

Ho un MODELLO con una collezione di altri modelli. Voglio che il mio viewmodel abbia una collezione osservabile di altri modelli di visualizzazione, ma una volta che l'ho istanziato in quel modo, la connessione tra il contenuto della raccolta del modello viene persa. Devo ora iniziare a collegare tutti gli eventi dalla collezione osservabile di viewmodels alla collezione di modelli?

+1

Sì, l'evento è il modo migliore per farlo. Prendi in considerazione l'utilizzo del pattern di eventi deboli per sicurezza. – Gusdor