2009-06-11 7 views
36

Sto sviluppando un'applicazione WPF utilizzando il pattern MVVM e ho bisogno di visualizzare un elenco di elementi in un ListView (con filtro), con i campi dell'elemento selezionato visualizzati in una vista Master/Dettagli. Sono diviso tra i seguenti due modi:MVVM: CollectionView in ViewModel o CollectionViewSource in xaml?

  1. Esporre un CollectionView nel mio ViewModel e vincolare a questo.
  2. Esporre un IList semplice nel mio ViewModel e utilizzare CollectionViewSource per creare CollectionView in XAML.

Esiste un modo accettato per farlo? Qualche idea sul modo migliore?

+1

È incredibile che molte volte scopriate che qualcuno ha già fatto esattamente la stessa domanda che avevate intenzione di chiedere. Grazie! :) –

risposta

30

Faccio il primo (esporre CollectionView dalla VM) ma ciò che importa è dove si trova la logica di filtraggio. Questo dovrebbe essere sicuramente nella VM in modo che possa essere testato, anche se la vista deve collegare il CollectionViewSource alla VM. Detto questo, non penso che ci sia qualcosa di particolarmente sgradevole o anti-MVVM sull'esposizione di un CollectionView dalla tua VM.

+0

Ti basta creare un nuovo CollectionView in ViewModel? MSDN per CollectionView dice che non dovresti creare un nuovo CollectionView ma invece creare un oggetto CollectionViewSource e ottenere la vista predefinita. Qual è il modo migliore per creare un CollectionView? –

+0

MSDN non è esattamente chiaro sul modo migliore di farlo nel codice. Creo solo la sottoclasse CollectionView direttamente (ad esempio ListCollectionView), ma suppongo che si possa usare anche CollectionViewSource. La mia comprensione è che CVS esegue solo la selezione della sottoclasse CV appropriata per te e fornisce il supporto XAML. Non ho avuto alcun problema nel creare il CV da solo, e sembra aver senso quando lo stai facendo in codice e già conosco il tipo di raccolta che stai avvolgendo. –

+0

Non dimenticare che WPF crea automaticamente viste per te quando leghi ... Ottieni una ListCollectionView quando ti colleghi a IList, ad esempio. Questo ha già una tonnellata di funzionalità di ordinamento/filtraggio/raggruppamento ma fa affidamento su come ottenere la raccolta di articoli dell'oggetto a cui si sta vincolando. Invece, è possibile utilizzare var view = CollectionViewSource.GetDefaultView (yourCollection) come ListCollectionView ;. Puoi fare tutti i tipi di cose interessanti allora. – Stimul8d

3

So che sono un po 'in ritardo a rispondere alla tua domanda ma l'ho appena visto oggi.

Ho creato i modelli di visualizzazione principale/dettaglio che utilizzano CollectionViewSource e ne sono stati sottoposti a blog.

ho scritto su un ViewModel per le tabelle principale/dettaglio qui che utilizza: http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html

si possono anche trovare un ViewModel per la classe ObservableCollection sulle mie pagine del blog.

Forse lo trovi utile.

Problemi correlati