Pregunta

Estoy utilizando el marco MVVM Light, así como la Unidad de DI. Tengo algunos Vistas anidados, cada uno unido a un modelo de vista correspondiente. Los ViewModels están obligados a DataContext control de la raíz de cada vista a través de la idea de que ViewModelLocator Laurent Bugnion ha puesto en MVVM Light. Esto permite encontrar ViewModels a través de un recurso estático y para controlar el tiempo de vida de ViewModels a través de un marco de inyección de dependencia, en este caso la Unidad. También permite Expression Blend para ver todo en lo que respecta a ViewModels y cómo enlazar ellos.

Como he indicado los puntos de vista tienen una buena dosis de anidación, pero los ViewModels realmente no saber nada el uno del otro. A vista padre se une a su correspondiente modelo de vista a través de la recurso estático ViewModelLocator (que utiliza la unidad para controlar la construcción y el tiempo de vida del objeto ViewModel). Ese punto de vista de los padres contiene un control de usuario en el mismo que es otro sub-view, que irá luego a su correspondiente modelo de vista a través de la ViewModelLocator también. Los ViewModels no tienen referencias entre sí o conocen ninguna jerarquía con respecto a la otra.

Así que aquí está un ejemplo de cómo los ViewModels hacen interactuar a través de mensajería. Tengo una vista padre que tiene un enlace de datos ComboBox a una ObservableCollection en su modelo de vista. SelectedItem del ComboBox también está obligado (bidireccional) a una propiedad en el modelo de vista. Cuando la selección del cuadro combinado cambia, esto es a las actualizaciones de activación en otras vistas y sub-Vistas. Actualmente estoy cumpliendo este a través del sistema de mensajería que se encuentra en MVVM Light.

Así que me pregunto cuál sería la mejor práctica para obtener información de un modelo de vista a otro? En este caso, lo que necesito para transmitir a los sub-ViewModels es básicamente un GUID de usuario que representa el usuario actualmente conectado. El más alto vista padre (bueno, ViewModel) conocerá esta información, pero no estoy seguro de cómo llegar abajo en las sub-ViewModels.

Algunas posibles enfoques que se me ocurren:

  • Debería el sub-modelo de vista pida al ViewModelLocator recurso estático para una referencia a la misma el objeto Ver los padres está utilizando y acceder a la la propiedad de esa manera? Parece que ViewModels que pasan por cada uno de los demás propiedades no es muy limpio y las mantiene juntas innecesariamente.

  • Ya estoy usando mensajes de notificación los sub-Vistas que el usuario seleccionado un nuevo elemento en el cuadro combinado y actualizar en consecuencia. Pero el objeto tipo que se selecciona en el ComboBox no es realmente directamente relacionada con este valor de datos que la sub-Vistas necesitan.

¿Fue útil?

Solución 2

Me decidí a tener los sub-ViewModels publicar un mensaje solicitando la información necesaria y luego tener el padre VM suscribirse a ese tipo de mensaje y símbolo de clave. No quiero abusar del uso de este medio de comunicación, pero creo que va a ser eficaz para algunas piezas de datos que estoy teniendo problemas para encontrar maneras de empujar hacia abajo a través de la jerarquía de vistas. Hasta este momento, la mayor parte del paso de datos ha sido en respuesta a los acontecimientos, pero no todas las piezas de los datos se pueden transferir de esta manera, sobre todo si se adquiere los datos o el evento que ocurre en una pantalla diferente antes de la nueva vista incluso está construida y leer para recibir los datos.

Yo tenía una conversación en Twitter con algunos nombres conocidos en este espacio (Glenn Block, John Papa, y Rob Eisenberg). Sugirieron una serie de cosas como un patrón de visitante, pero no estaba seguro de que iba a funcionar tan bien sin una jerarquía de máquinas virtuales. Esto podría deberse a que mi diseño ha sido más o menos Ver-en primer lugar, a diferencia de un modelo de vista-primer acercamiento. Otra sugerencia que puede haber sido viable sería la de modificar mi ViewModelLocator y Dependencia uso de inyección para incluir la capacidad de pasar en los valores de los datos a la sub-máquinas virtuales en tiempo de creación. Tuve un poco de problemas para imaginar que debido a la naturaleza estática de la VML, y decidió la solución solicitud de mensaje que se me ocurrió sería más sencillo y simple, por el momento. probablemente voy a tener que reconsiderar la solución si no termina siendo demasiado muchas más piezas de datos que caen en esta situación.

Otros consejos

he visto básicamente dos métodos para esto. Para la comunicación de carácter general-VM el patrón evento agregador funciona muy bien.

Para jerarquías de máquinas virtuales sin embargo con un patrón de Visitantes puede ser mejor. Con un visitante puede tener información que fluye a través de la jerarquía, por ejemplo, dando a cada niño una referencia al padre VM automáticamente.

También puede hacer esto con EA, pero el desafío está pasando alrededor de suficiente información en la carga útil del mensaje de tal manera que los niños sepan que es algo que deben preocuparse por.

En lo que VM localizador, absolutamente no! El material localizador VM es estrictamente para la unión en la interfaz de usuario no debe propia superficie exterior de ese contexto (óptima).

Mi $ .02 Glenn

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