Да, я смог сделать эту работу следующим образом:
В своем приложении WPF хоста я добавил этот импорт:
[ImportMany("ApplicationResources", typeof(ResourceDictionary))]
public IEnumerable<ResourceDictionary> Views { get; set; }
Затем в своей составной части я объявил ViewModel и шаблон данных для ViewModel в обычном Xaml-файле ResourceDictionary. Затем я создал код для ResourceDictionary, например так (в этом примере ViewModel называется ItemViewModel, а ResourceDictionary называется ItemView):
[Export("ApplicationResources", typeof(ResourceDictionary))]
public partial class ItemView : ResourceDictionary
{
public ItemView()
{
InitializeComponent();
}
}
Для справки, Xaml для примера ResourceDictionary выглядит так:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyCompany.MyProduct"
x:Class="MyCompany.MyProduct.ItemView">
<DataTemplate DataType="{x:Type local:ItemViewModel}">
...
</DataTemplate>
</ResourceDictionary>
Затем, вернувшись в мое приложение WPF хоста, после того, как я успешно скомпоновал и перед тем, как показать главное окно, я делаю это:
// Add the imported resource dictionaries
// to the application resources
foreach (ResourceDictionary r in Views)
{
this.Resources.MergedDictionaries.Add(r);
}
Похоже, что успешно применяется DataTemplate везде, где WPF видит ItemViewModel.
РЕДАКТИРОВАТЬ : Для тех, кто заинтересован, я выпустил платформу приложения под названием SoapBox Core в качестве открытого источника, и он широко использует этот метод для импорта представлений в ресурсы приложения. Он работает очень хорошо, и вы можете сами загрузить исходный код и посмотреть, как он работает.