2012-03-04 17 views
10

Estoy tratando de encontrar la mejor manera de acoplar mis vistas y modelos de vista en MVVM y me he basado en el enfoque ViewModel-first utilizando mecanografiado DataTemplates, como se describe en this article y en this answer. Estoy usando Prism y tengo varios módulos que tienen sus propias bibliotecas de proyectos/clases.¿Dónde debería definir mis plantillas de datos?

Mi pregunta es: ¿Dónde deberían mis DataTemplates vivir en mi solución?

  1. ¿Debo poner los DataTemplates en un diccionario de recursos que vive en el mismo proyecto que tiene los tipos/ViewModels que presta?
  2. ¿Debo colocar las plantillas de datos en un diccionario de recursos que vive en el proyecto que tiene la ventana principal de la aplicación (es decir, Shell.xaml)?
  3. ¿Se deberían agregar estos diccionarios de recursos al App.Current.MainWindow.Resources.MergedDictionaries?

Espero que esto es suficiente información para describir lo que estoy tratando de hacer.

Actualización: ver los comentarios de la respuesta seleccionada.

Respuesta

2

Estoy seguro de que la mejor manera aquí es usar el archivo de recursos Themes \ Generic.xaml. Este es un archivo (debe estar exactamente en la carpeta Temas y tiene el nombre exactamente Generic.xaml) utilizado por el motor de temas de WPF/Silverlight y contiene recursos compartidos a través de toda la aplicación. También puede crear archivos separados en la carpeta Temas con nombre como Generic.DataTemplates.xaml y agregarle un enlace desde Generic.xaml. Google sabe mucho sobre generic.xaml o puede ver más detalles en mi respuesta aquí: WPF Prism - Where to put Resources?

+0

Hola, gracias por tu sugerencia. Leí esa publicación hace un tiempo y uso el método que Rachel describe allí. Tengo un proyecto de infraestructura con una carpeta de temas donde almaceno mis estilos en 'Diccionarios de recursos'. El problema es que todos mis otros proyectos/módulos hacen referencia a este proyecto de infraestructura. Para usar 'DataTemplates' mecanografiadas requeriré referencias a los proyectos que contienen mi ViewModels que significaría crear una dependencia circular. ¿Debería crear un proyecto separado para contener solo 'DataTemplates'? –

+1

Creo que puede crear solo temas de carpeta en el ensamblaje de su módulo. Lo hago de esta manera en el proyecto actual: he compartido plantillas en un ensamblado de IU separado y casi cada ensamblaje de módulo tiene su propia carpeta Temas – chopikadze

+0

Ok, ¡eso suena como el camino a seguir! Gracias, aprecio tu consejo. Veré si puedo hacerlo funcionar. –

2

Actualizado para explicar más claro.

Diré si su DataTemplate es genérica: es decir, usted tiene un UserControl que se une a un ViewModel, y ese ViewModel tiene BaseViewModel, que expone algún tipo de propiedades. Su DataTemplate muestra esas propiedades. Entonces puede usar este DataTemplate en cada ViewModel que Implemente el BaseViewModel.

Es mejor ponerlo en App.xaml, por lo que podrá sacarlo con la llave y aplicarlo en un lugar diferente de su proyecto.

Pero si su DataTemplate es muy específico,

es decir, existe un control de usuario que sólo se toma de la propiedad se especifica en dicho modelo de vista y usted sabe ningún otro control se une a ese modelo de vista, tendrá que poner en el el mismo archivo de Xaml Resources o donde define su UserControl.

+0

Entiendo que puedo usar 'DataTemplates' para personalizar la visualización de datos en, por ejemplo,' ListBox' y puedo reutilizar esta 'DataTemplate' y aplicarla a múltiples' ListBoxes' al referirme a '' x: Key'. Pero de acuerdo con el artículo de Josh Smith (ver arriba), creo que también puedo usar ** DataPolders ** 'tipeados' para acoplar un View/UserControl a un' ViewModel'. Es decir. si agrego un objeto ViewModel a un 'ListBox', WPF renderizará el ViewModel usando el UserControl especificado en' DataTemplate' (en lugar de usar ToString()). ¿Estoy lejos de aquí? –

+0

@Angavar Sí, también puede usar DataTemplate escrito para aplicarlo. Solo estoy dando un ejemplo de cómo puedes usar su x: Tecla extraer la plantilla, el estilo, etc. –

0

De acuerdo con Microsofts App Studio las plantillas de datos deben residir en un subdirectorio DataTemplates bajo el Directorio de vistas. Una aplicación universal tiene este directorio tanto para la interfaz de usuario de Windows como para la interfaz de usuario de Windows Phone, por lo que no está en el proyecto compartido porque no son iguales. No use la arquitectura Converge PRISM. ¡Está completamente mal diseñado! Eso no fue escrito con una arquitectura de Windows y Windows Phone en mente, sino como si lo llamaran Converged. Debería haber sido completamente rediseñado como funciona en Microsofts App Studio. No busque la Inyección de Dependencia, no está en ella y no es necesaria. La mayoría usa Inyección de Dependencia para interfaces stub o falsas. El DataContext para datos de diseño ahora funciona tan bien con datos json que un componente de Inyección de Dependencia sería excesivo.

Cuestiones relacionadas