¿Usando MEF para importar un WPF DataTemplate?

Estaba buscando MEF como un marco de extensibilidad, y estoy bastante vendido, excepto por un punto:

Digamos que quiero importar un ViewModel y una View para mostrarlo. Creo que la forma “correcta” de hacerlo es que la parte MEF exporte una clase ViewModel y una DataTemplate que muestre ViewModel. Como ejemplo, supongamos que está creando una aplicación similar a Visio y desea importar una biblioteca de formas. Cada forma necesita una vista definida en Xaml y un modelo de vista que envolvería algún objeto modelo subyacente.

es posible? ¿Cómo se vería el contrato de importación para DataTemplate y cómo hago que WPF conozca el DataTemplate importado?

Sí, pude hacer que esto funcione de la siguiente manera:

En mi aplicación host WPF, agregué esta importación:

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

Luego, en mi parte compuesta, declare ViewModel y una plantilla de datos para ViewModel en un archivo ResourceDictionary Xaml. Luego creé un código detrás para ResourceDictionary, así (en este ejemplo, ViewModel se llama ItemViewModel y ResourceDictionary se llama ItemView):

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

Como referencia, el Xaml para el ejemplo ResourceDictionary se ve así:

   ...   

Luego, de vuelta en mi aplicación host WPF, después de componer con éxito y antes de mostrar la ventana principal, hago esto:

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

Parece que se aplica con éxito DataTemplate en cualquier lugar donde WPF vea un ItemViewModel.

EDITAR : Para cualquiera que esté interesado, lancé un marco de aplicación llamado SoapBox Core como código abierto, y usa este método ampliamente para importar Vistas a los recursos de la aplicación. Funciona muy bien, y puede descargar la fuente usted mismo y echar un vistazo a cómo funciona.

Intereting Posts