2010-09-08 24 views
9

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

7

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.

+0

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

3

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.

10

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.

0

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.

Cuestiones relacionadas