2009-06-11 15 views
36

Estoy desarrollando una aplicación WPF usando el patrón MVVM y necesito mostrar una lista de elementos en un ListView (con filtrado), con los campos del elemento seleccionado en una vista Maestra/Detalles. Estoy dividido entre las dos formas siguientes de hacer esto:MVVM: CollectionView en ViewModel o CollectionViewSource en xaml?

  1. Exponer un CollectionView en mi ViewModel, y vinculante para esto.
  2. Exponer un IList simple en mi ViewModel y usar CollectionViewSource para crear el CollectionView en XAML.

¿Hay una forma aceptada de hacerlo? ¿Alguna idea de la mejor manera?

+1

Es sorprendente que muchas veces descubras que alguien ya hizo exactamente la misma pregunta que ibas a preguntar. ¡Gracias! :) –

Respuesta

30

Hago lo anterior (expongo CollectionView desde la VM) pero lo que realmente importa es dónde está tu lógica de filtrado. Eso definitivamente debería estar en la VM para que pueda ser probado, incluso si la vista tiene que conectar el CollectionViewSource a la VM. Dicho esto, no creo que haya nada particularmente desagradable o anti-MVVM sobre exponer un CollectionView desde su máquina virtual.

+0

¿Acabas de crear un nuevo CollectionView en ViewModel? MSDN para CollectionView dice que no debería crear una nueva CollectionView, sino crear una CollectionViewSource y obtener la vista predeterminada. ¿Cuál es la mejor manera de crear un CollectionView? –

+0

MSDN no tiene exactamente claro cuál es la mejor manera de hacerlo en el código. Simplemente creo la subclase CollectionView directamente (por ejemplo, ListCollectionView), pero supongo que también podría usar CollectionViewSource. Tengo entendido que CVS solo hace la selección de la subclase CV adecuada para usted y brinda soporte XAML. No he tenido ningún problema para crear el CV yo mismo, y parece tener sentido cuando lo haces en código y ya sabes el tipo de la colección que estás envolviendo. –

+0

No olvide que WPF crea automáticamente vistas para usted cuando se vincula ... Obtiene un ListCollectionView cuando se une a IList, por ejemplo. Esto ya tiene TONELADAS de funcionalidad de clasificación/filtrado/agrupamiento pero depende de que consigas la colección de Objetos del objeto al que te estás vinculando. En su lugar, puede usar var view = CollectionViewSource.GetDefaultView (yourCollection) como ListCollectionView ;. Puedes hacer todo tipo de cosas interesantes entonces. – Stimul8d

3

Sé que estoy un poco tarde respondiendo su pregunta, pero acabo de verla hoy.

He creado viewmodels de maestro/detalle que usan CollectionViewSource y escribí sobre ellos en el blog.

me escribió acerca de un modelo de vista para las tablas de maestro/detalle aquí que utiliza: http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html

También puede encontrar un modelo de vista de la clase ObservableCollection en mis páginas del blog.

Quizás le resulte útil.

Cuestiones relacionadas