En el patrón MVVM (Model-View-ViewModel) el ViewModel debe hacer referencia a la vista. Yo pensaría que no debería. Pero, ¿cómo debería manejarse el siguiente escenario? Tengo una vista que tiene un control de pestañas como contenedor principal, el modelo de vista para esta vista implementa un comando para agregar una pestaña nueva al control de pestañas. La manera más fácil sería permitir que el modelo de vista haga referencia a la vista y luego en la implementación del comando simplemente agregar programáticamente la nueva pestaña a la pestaña de control en la vista. Esto simplemente parece incorrecto. Debo vincular de algún modo el tabcontrol al viewmodel y luego implementar una plantilla de datos/control para agregar las nuevas pestañas. Espero que esto tenga algún sentido para alguien :)¿Debería un ViewModel en MVVM hacer referencia a la vista?
Respuesta
Reed y Dan cubrieron el enfoque general pero en referencia a En su caso específico, TabControl es un ItemsControl y puede vincular su ItemsSource a una colección de datos en su ViewModel que representa el conjunto de pestañas para mostrar. La interfaz de usuario para cada tipo de pestaña puede representarse mediante una plantilla de datos específica para el tipo de datos de un elemento (ya sea utilizando DataType o DataTemplateSelector). A continuación, puede agregar o eliminar elementos de datos según sea necesario desde su VM y hacer que las pestañas se actualicen automáticamente sin que la VM sepa nada acerca de TabControl.
Me parece que a menudo es un compromiso útil exponer una interfaz en la Vista que maneja la funcionalidad específica de la Vista. Esta es una buena manera de manejar cosas que son difíciles de lograr con un enlace puro, como ordenar el cierre de la forma, abrir un cuadro de diálogo de archivo (aunque a menudo se pone en su propia interfaz de servicio) o interactuar con controles no diseñados para datos vinculante (como el ejemplo que proporcionó)
El uso de una interfaz aún mantiene la View and ViewModel ampliamente desacoplada y le permite simular el IView específico durante la prueba.
En MVVM "puro", ViewModel realmente no debería hacer referencia a la Vista. Sin embargo, a menudo es conveniente proporcionar algún tipo de interfaz en la Vista mediante la cual ViewModel puede interactuar con ella.
Sin embargo, he descubierto que casi nunca vuelvo a hacer eso. El enfoque alternativo es usar algún tipo de attached property o comportamiento de combinación dentro de su Vista, y vincularlo a sus propiedades de ViewModel. Esto le permite mantener la lógica de visualización al 100% dentro de la vista. Además, al crear un comportamiento para esto, crea un tipo de reutilizable que se puede usar para manejar esto en cada interacción de ViewModel-> View. Realmente prefiero este enfoque sobre tener cualquier lógica de Vista dentro de ViewModel.
Para demostrar esta técnica, escribí una muestra para la Expression Code Gallery llamada WindowCloseBehavior. Demuestra cómo se puede usar un Comportamiento dentro de la Vista vinculado a las propiedades en el ViewModel para controlar el ciclo de vida de una Ventana, incluyendo la prevención de su cierre, etc.
A uno de nosotros le falta algo obvio. Su control de pestañas es un ItemsControl. Debe vincular el ItemsSource de su control de pestaña a una colección ovservable en su modelo de vista. Cuando maneja el comando en su modelo de vista para agregar una pestaña, simplemente agrega un nuevo elemento a esta colección y, listo, ha agregado una nueva pestaña al control.
- 1. MVVM Ver referencia a ViewModel
- 2. WPF (MVVM): ¿Cerrar una vista desde Viewmodel?
- 3. Prism2/MVVM Cerrar Vista desde ViewModel
- 4. ¿Debería MVVM ViewModel realizar una conversión/validación de tipo?
- 5. MVVMLight: cómo obtener una referencia al ViewModel en la Vista?
- 6. MVVM ViewModel vs. MVC ViewModel
- 7. Jerarquía MVVM y View/ViewModel
- 8. EF4 + MVVM - ¿Exponer entidades en ViewModel?
- 9. ¿Debería una Vista vincularse indirectamente a propiedades en un Modelo en MVVM?
- 10. La mejor manera de crear un ViewModel en MVVM
- 11. ¿Cómo hacer referencia a la vista "máxima"?
- 12. ¿Cuál es la convención estándar para definir la vista anidada: mapeo de viewmodel en MVVM Light
- 13. ¿Puede un ViewModel hablar con View en el patrón MVVM?
- 14. Cuándo desechar ViewModel en MVVM Light
- 15. MVC pase JSON ViewModel a la vista
- 16. ¿Por qué debería usar MVVM en la aplicación Silverlight?
- 17. Usando MVVM, ¿cómo puede un ContextMenu ViewModel encontrar el ViewModel que abrió el ContextMenu?
- 18. En MVVM, ¿cuál es la mejor manera para que ViewModel responda a las acciones del usuario en la Vista?
- 19. MVVM: ¿Realmente la vista necesita tener un constructor predeterminado?
- 20. Aclaración MVVM: ¿Qué pertenece a ViewModel, qué pertenece al modelo?
- 21. ¿Necesito un controlador de vista para MVVM-light en Silverlight?
- 22. MVVM: CollectionView en ViewModel o CollectionViewSource en xaml?
- 23. Patrón de MVVM, pregunta de ViewModel DataContext
- 24. ViewModel por vista o por modelo?
- 25. ¿Debería mi ViewModel tener una ObservableCollection de Views o ViewModels?
- 26. "¿Estás seguro?" indicaciones. ¿Parte del ViewModel o simplemente la vista?
- 27. Conectando el ViewModel a la Vista en Silverlight
- 28. MVVM Encuadernación a InkCanvas
- 29. Dependencias y referencias: ¿a qué debería hacer referencia exactamente?
- 30. Animaciones de vista dinámica usando MVVM
Todas las demás respuestas son buenas. Este solo cubre lo que quiero hacer específicamente. Incluso encontré una manera de establecer el elemento seleccionado en el modelo de vista sin hacer referencia a la vista a través de una propiedad en mi máquina virtual vinculada al último modelo agregado en mi colección. Muy aseado ... – Johan