Tak, byłem w stanie wykonać tej pracy w następujący sposób:
W mojej aplikacji hosta WPF, dodałem tego importu:
[ImportMany("ApplicationResources", typeof(ResourceDictionary))]
public IEnumerable<ResourceDictionary> Views { get; set; }
Wtedy w moim kompozytowej części I ogłoszony ViewModel oraz szablon danych dla ViewModel w zwykłym pliku Xaml ResourceDictionary. Potem stworzył kod tyłu za ResourceDictionary, jak to (w tym przykładzie ViewModel nazywa ItemViewModel i ResourceDictionary nazywa ItemView):
[Export("ApplicationResources", typeof(ResourceDictionary))]
public partial class ItemView : ResourceDictionary
{
public ItemView()
{
InitializeComponent();
}
}
Dla porównania, XAML dla przykładu ResourceDictionary wygląda następująco:
<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>
Następnie z powrotem w mojej aplikacji hosta WPF, po tym, jak z powodzeniem komponować i zanim pokażę okno główne, robię to:
// Add the imported resource dictionaries
// to the application resources
foreach (ResourceDictionary r in Views)
{
this.Resources.MergedDictionaries.Add(r);
}
Wydaje się, że z powodzeniem stosuje się DataTemplate w dowolnym miejscu, w którym WPF widzi ItemViewModel.
EDIT: Dla każdego, kto jest zainteresowany, wydałem ramy aplikacji nazwie SoapBox Core jako open source, i to w znacznym stopniu korzysta z tej metody importowania Wyświetleń do zasobów aplikacji. Działa bardzo dobrze, możesz sam pobrać źródło i sprawdzić, jak działa.
Próbowałem tego dokładnego podejścia, ale ResourceDictionary jest pusty w czasie ładowania. Czy istnieje sposób na wymuszenie inicjalizacji lub czy robię coś złego? –