Pregunta

Estoy construyendo una aplicación que se basa en MVVM-Light. Estoy en la necesidad de crear varias instancias de la misma opinión, y cada uno debe unirse a su propio modelo de vista.

Los ViewModels implementos ViewModelLocator predeterminado como únicos, por lo tanto, diferentes instancias de la misma vista se unirá a la misma ViewModel.

Podría crear el modelo de vista en el VMLocator como un objeto no estática (tan simple como devolver nueva máquina virtual () ...), pero eso sólo me ayudará parcialmente. De hecho, todavía tengo que llevar un registro de las ventanas abiertas. Sin embargo, cada ventana puede abrir otras ventanas (de un tipo diferente, sin embargo). En esta situación puede ser que necesite para ejecutar alguna operación en los padres Ver y todos sus hijos. Por ejemplo, antes de cerrar la Vista P, puede ser que desee cerrar todos sus hijos (ver C1, C2 vista, etc.).

Por lo tanto, ¿hay alguna manera simple y fácil para lograr esto? O ¿hay alguna buena práctica que me aconsejaría a seguir?

Gracias de antemano por su valiosa ayuda.

Saludos, España Gianluca.

¿Fue útil?

Solución

No hay obligación de almacenar los ViewModels como únicos en el ViewModelLocator, pero sin duda hace que sean más fáciles de encontrar si la vista es un conjunto unitario demasiado . Obviamente, si tiene varias instancias de la misma clase View, tendrá varias instancias de la misma clase modelo de vista, y no puede ser un producto único más.

Para realizar un seguimiento de las varias instancias del modelo de vista, se puede aplicar un diccionario en el ViewModelLocator que mira hacia arriba para un modelo de vista según una clave. La clave puede ser un ID único para la vista, por ejemplo. Una vez que controlar la vista, recuperar su clave y luego recuperar el modelo de vista desde el localizador.

Actualizar : A menudo ni siquiera necesita para realizar un seguimiento de múltiples ViewModels. Por ejemplo, puede tener la clase de mensajería envía un mensaje a todas las instancias de una clase determinada utilizando el modelo de vista sobrecarga Enviar. Así que antes de la implementación de un diccionario para realizar un seguimiento de las máquinas virtuales, pregúntate si realmente lo necesita! ;)

Espero que ayude, Laurent

Otros consejos

I utilizó el sistema de denominación del recipiente unidad.

Ver " ¿Cómo distinguir múltiples pares vista / vista de modelo usando recipiente unidad ".

Yo tenía un problema con el envió y resuelto en esta pregunta SO . Resultó ser muy relacionada con la respuesta del Sr. Bugnion aquí (que me ayudó enormemente, gracias!)

Lo que he encontrado es que no es necesario para almacenar la propiedad vista-modelo en el ViewModelLocator en absoluto. Sólo tiene que utilizar ServiceLocator para crear una instancia con una llave, y en su "servicio de diálogo", pasar la clave para ShowDialog<T>(string key = null).

Además, como se menciona en este hilo ya, el uso Messenger.Default.Send método y recuerde llamar viewModel.Cleanup() después para anular el registro de la vista-modelo de Messenger, evitando así Phantom View-modelos de tratar de mensajes de proceso enviados a todas las instancias de la vista- tipo de clase del modelo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top