2010-02-11 5 views
5

J'utilise Prism depuis un certain temps maintenant et apprécie à quel point il est plus facile de découpler mes modules.Comment utiliser DataTemplates dans Prism

Cela fonctionne particulièrement bien pour les vues et les modèles de vue car vous pouvez injecter les modèles de vue via des interfaces et les vues via le gestionnaire de région.

Malheureusement, cela ne fonctionne que lorsque mes vues sont des commandes utilisateur complètes à moins que je ne manque quelque chose ici (et j'espère sincèrement que je suis).

Bien souvent, je vais créer un ViewModel et un DataTemplate correspondant. Ceux-ci peuvent ensuite être utilisés par d'autres assemblages pour composer une vue.

Mon problème est que je ne vois aucun moyen de se référer à ces DataTemplates sans faire référence à l'ensemble contenant, donc dans mon fichier XAML j'écris quelque chose comme:

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

Bien sûr, ce n'est pas vraiment découplé, bien que J'essaie de m'assurer que je ne me réfère pas à l'assemblage ailleurs dans mon code. Une autre solution à laquelle je pensais, était de mettre les datatemplates dans le projet d'infrastructure, mais je n'aime pas trop ça non plus, car je veux que tout ce qui appartient à un module soit contenu dedans (excepté les interfaces de cours).

Alors, est-ce que quelqu'un a une bonne solution de contournement, ou ai-je manqué une fonctionnalité Prism?

Répondre

2

Je suggère de créer un service qui encapsule l'ajout de dictionnaires de ressources à la collection 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); 
    } 
} 

Je vous attendre « résoudrait » ce service lors du chargement du module et l'utiliser pour « enregistrer » les dictionnaires de ressources module local.

+0

Cela devrait fonctionner, le seul inconvénient de ceci est que je ne reçois aucune aide dans mon fichier xaml, si je n'y ai pas explicitement importé les datatemplates. Par exemple. Resharper met en garde "Ressource non trouvée" et je perds la réaction qui me permet de savoir si j'ai épelé les choses droite etc ... Si je pouvais seulement me référer aux modèles de données comme si elles étaient des interfaces ... –

Questions connexes