Usando MEF per importare un DataTemplate WPF?

Stavo guardando il MEF come un framework di estensibilità, e sono praticamente venduto, ad eccezione di un punto:

Diciamo che voglio importare sia un ViewModel che una vista per visualizzarlo. Penso che il modo “giusto” per farlo sia che la parte MEF esporti una class ViewModel e un DataTemplate che visualizza ViewModel. Ad esempio, supponi di creare un’applicazione simile a Visio e di importare una libreria di forms. Ogni forma ha bisogno di una vista definita in Xaml e un ViewModel in grado di avvolgere alcuni oggetti del modello sottostante.

È ansible? Come si presenta il contratto di importazione per DataTemplate e come faccio a rendere WPF consapevole del DataTemplate importato?

Sì, sono stato in grado di farlo funzionare nel modo seguente:

Nella mia applicazione WPF host, ho aggiunto questa importazione:

[ImportMany("ApplicationResources", typeof(ResourceDictionary))] public IEnumerable Views { get; set; } 

Poi nella mia parte composita, ho dichiarato un ViewModel e un modello dati per ViewModel in un file Xaml ResourceDictionary normale. Quindi ho creato un codice per il ResourceDictionary, come questo (in questo esempio, ViewModel si chiama ItemViewModel e ResourceDictionary si chiama ItemView):

 [Export("ApplicationResources", typeof(ResourceDictionary))] public partial class ItemView : ResourceDictionary { public ItemView() { InitializeComponent(); } } 

Per riferimento, l’Xaml per l’esempio ResourceDictionary si presenta così:

   ...   

Quindi, di nuovo nella mia applicazione WPF host, dopo aver composto con successo e prima di mostrare la finestra principale, faccio questo:

 // Add the imported resource dictionaries // to the application resources foreach (ResourceDictionary r in Views) { this.Resources.MergedDictionaries.Add(r); } 

Sembra che applichi correttamente DataTemplate ovunque WPF veda un ItemViewModel.

EDIT : Per chiunque sia interessato, ho rilasciato un framework di applicazione chiamato SoapBox Core come open source e utilizza questo metodo in modo estensivo per importare Views nelle risorse dell’applicazione. Funziona molto bene, e puoi scaricare tu stesso la fonte e dare un’occhiata a come funziona.