2010-02-11 11 views
5

He estado utilizando Prism por un tiempo y disfruto de lo fácil que es desacoplar mis módulos.Cómo usar DataTemplates en Prism

Esto funciona especialmente bien para vistas y ver modelos ya que puede inyectar los modelos de vista a través de interfaces y las vistas a través del administrador de región.

Desafortunadamente, esto solo funciona cuando mis vistas son controles completos del usuario a menos que me falta algo aquí (y sinceramente espero que así sea).

Muchas veces, creo un ViewModel y un DataTemplate coincidente. Estos pueden ser utilizados por otros ensambles para componer una vista.

Mi problema es que no veo ninguna manera de referirse a estos DataTemplates sin hacer referencia al conjunto que contiene, por lo que en mi archivo XAML que escribo algo como:

<ResourceDictionary Source="pack://application:,,/......> 

Por supuesto, esto no es realmente desacoplado, aunque Intento asegurarme de que no me refiero al ensamblaje en ningún otro lugar de mi código.

Otra solución en la que pensé, fue colocar las plantillas de datos en el proyecto de Infraestructura, pero tampoco me gusta demasiado, ya que quiero que todo lo que pertenece a un módulo esté contenido (excepto las interfaces de curso).

Entonces, ¿alguien tiene una buena solución, o me perdí alguna función de Prisma?

Respuesta

2

Sugeriría crear un servicio que encapsule la adición de diccionarios de recursos a la colección Application.Resources.MergedDictionaries.

// Service interface (defined in the 'infrastructure' project) 
public interface IResourceAggregator 
{ 
    void AddResource(Uri resourceUri); 
} 

// Service implementation (implemented at the application/shell level) 
class ResourceAggregator : IResourceAggregator 
{ 
    public void AddResource(Uri resourceUri) 
    { 
     var resourceDictionary = new ResourceDictionary() { Source = resourceUri }; 
     var app = Application.Current; 
     app.Resources.MergedDictionaries.Add(resourceDictionary); 
    } 
} 

Esperaría que "resuelva" este servicio durante la carga del módulo y lo use para "registrar" los diccionarios de recursos locales del módulo.

+0

Eso debería funcionar, la única desventaja de esto es que no recibo ayuda dentro de mi archivo xaml, si no importo explícitamente las plantillas de datos. P.ej. Resharper advierte "Recurso no encontrado" y pierdo los comentarios que me permiten saber si escribí las cosas derecha, etc. ... Si solo pudiera referirme a las plantillas de datos como si fueran interfaces ... –

Cuestiones relacionadas