2011-08-13 10 views
5

Estoy trabajando en una aplicación MVVM grande. Estoy usando el juego de herramientas ligero MVVM para esto. La aplicación es como un navegador web con botones hacia atrás y hacia adelante. La vista principal es un control de usuario. Coloqué los botones hacia atrás y hacia adelante en el control de usuario de la vista principal. La vista principal a su vez tiene controles de usuario. Los controles de usuario cambian cuando se hace clic en los botones hacia atrás y hacia adelante. El ViewModel principal realiza un seguimiento del control de usuario actual y carga el siguiente dependiendo del clic del botón.MVVM: comunicación

Todos estos controles de usuario se cargan en función de la selección (ID) realizada en el primer paso. Digamos que la vista principal es una pantalla de búsqueda y seleccionamos un cliente. Las siguientes pantallas serían Dirección, Facturación, Solicitudes, etc. Estas pantallas no comparten ningún dato. Pero los datos son para el mismo cliente.

Entonces, ¿es una buena práctica almacenar la identificación del cliente en la vista principal? Si hago esto, debería tener un evento UserControl_Loaded vinculado a un comando, donde luego solicitaría Dirección e Información de facturación.

O puedo mover los botones (botones hacia atrás y hacia delante) a cada control de usuario en lugar de a la vista principal, pasar la identificación del cliente con el mensaje que cargaría la siguiente vista.

Cual es mejor?

+0

Para desacoplar elementos, considere usar MVVM Light 'Messenger' para publicar mensajes' CustomerSelected' (que pueden contener un Id), en lugar de usar comandos. Sus otros controles pueden suscribirse a este mensaje. –

+0

Mi pensamiento inicial sobre esto fue que, si los botones hacia atrás y hacia adelante están en la vista principal, dependiendo de la fuente (vista actual), necesito enviar un mensaje a los modelos de vista. Quería evitar eso (enviando un mensaje desde la vista principal dependiendo de la vista actual). Así que estaba pensando en el evento User_Control Loaded. – katie77

+0

¿Por qué quieres evitar enviar un mensaje? –

Respuesta

4

Una forma en que he hecho este tipo de cosas en el pasado es implementar una clase que encapsula el contexto de datos para la operación. Todas las páginas se llenarán con las propiedades (y actualización) de esta clase. El modelo de vista principal crea una instancia de esta clase y una colección de los modelos de vista de página, proporcionando a cada uno el contexto de datos. También maneja la navegación de una página a otra, implementando las propiedades CurrentPage, NavigateForwardCommand y NavigateBackwardCommand.

Si el usuario realiza una copia de seguridad en la página 1 y cambia la ID del cliente, el contexto de datos se vuelve a llenar con la información adecuada para el nuevo cliente. Como todas las páginas están mirando el mismo objeto de contexto de datos, todas las páginas siguientes mostrarán la información correcta.

Deberá implementar la notificación de cambio de propiedad en el objeto de contexto de datos y manejar PropertyChanged en las páginas. Cuando la propiedad CustomerID cambia en el objeto de contexto de datos, los modelos de vista de página deberán actualizar las propiedades que aparecen en sus respectivas vistas.

+0

Gran respuesta. Solo para agregar algunos bits ... Cada vista, al igual que la vista principal, debe tener un contexto de datos representativo del tipo de operación que está realizando. Si la selección del cliente está ocurriendo en la vista principal, su contexto de datos debe tener una propiedad SelectedCustomerId.Pero, en última instancia, la vista principal tendrá que informar a sus hijos de estos cambios de alguna manera, y una forma es dar a cada vista infantil una referencia al contexto de datos de la vista principal desde el que pueden determinar la identificación del cliente actual. –

+0

Hola, estoy confundido aquí. Lo siento, si estoy haciendo preguntas básicas. Pero en MVVM light hay un localizador de modelos de View. Creamos una instancia del modelo de vista en esa clase. Intenté crear una clase que tuviera todos los modelos de vista e intenté Crear una instancia de un modelo de vista. Pero no funcionó – katie77

+0

Creo que vas a necesitar investigar qué está sucediendo realmente cuando intentes crear una instancia de este objeto, y describir qué, específicamente, no está funcionando como esperabas. –