2016-09-21 2 views
0

im Verwenden von MVVMLight Toolkit für WPF und C#. Es gibt eine WPF-Anwendung mit einem Fenster (Shell) und eine Assembly mit den Steuerelementen (UI). Die ViewModels befinden sich in der dritten DLL (BIZ).MVVMLight DataTemplates in Assembly-Ressource-Wörterbuch

Das einzige, was im Fenster angezeigt wird, ist ein Steuerelement namens "ShellView", das der Hauptbenutzeroberflächenabschnitt ist. Ich mache das, um den größten Teil der Anwendung in verschiedenen Fenstern wiederverwenden zu können.

Im Moment mache ich alle Bindungen zwischen Ansicht und Viewmodel in der "Shell" App.config.

Ive verwiesen:

Die Montagenamespaces

xmlns:views="clr-namespace:Application.UI;assembly=Application.UI" 
xmlns:vm="clr-namespace:Application.BIZ;assembly=Application.BIZ" 

Viewmodel Locator

<vm:ViewModelLocator xmlns:vm="clr-namespace:Application.BIZ;assembly=Application.BIZ" x:Key="Locator" d:IsDataSource="True" /> 

und verwendet, um die Datatemplates

<DataTemplate 
    DataType="{x:Type vm:ShellVM}"> 
<views:ShellView /> 

Wenn also der Inhalt eines Content Controls mit einer Klasse von "ViewModelBase" verknüpft wird, wird die View automatisch angezeigt - alles funktioniert einwandfrei.

Jetzt versuche ich, die Definition der Datenvorlagen in die UI-Assembly zu verschieben und nur in der Anwendung Fenster verweisen. Das Templating und die Bindung werden also in der UI-Assembly durchgeführt, und das Fenster verweist nur auf alle Assemblies und zeigt das "ShellView" an.

Meine Frage ist: Ist das möglich und wie muss ich auf die Assemblys in App.xaml verweisen? Im Moment bekomme ich viele xaml parse Ausnahmen.

Danke im Voraus

Antwort

0

So etwas sollte in Ihrem neuen Projekt eine Ressource Wörterbuch arbeiten, fügen Sie und Ihre Vorlage, um es hinzuzufügen

<ResourceDictionary> 
<DataTemplate x:Key="Foo" > 
</ResourceDictionary> 

Und in Ihrem app.xaml

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      path to your Foo datatemplate for example 
      <ResourceDictionary Source="MyAssembly;component/MyFolder/MyResourceDictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
</Application> 

und dann von Ihrem Code verweisen Sie es als StaticResource

Beispiel

<ListBox ItemTemplate="{StaticResource Foo}"/> 
+0

Die Datenvorlagen werden nicht im Hauptanwendungsfenster xaml verwendet. Würde Ihre Lösung auch in der Kontrollbibliothek funktionieren? Normalerweise benutze ich sie nur für View-ViewModel-Binding. Lies dies: die Datenvorlagen machen den Rest – pwoestmann

+0

@pwoestmann Die app.xaml kannst du in jedem Projekt haben. Während der Laufzeit wird jedoch nur die aus dem exe-Projekt verwendet. Wenn Sie also bei dieser Lösung bleiben möchten, müssen Sie diesen Ressourcenabschnitt duplizieren. So einer in dem Projekt, wo Sie Ihre Datatemplates konsumieren möchten, so dass der Designer nicht meckert, und einer innerhalb des Hauptprojekts, also wenn es läuft, weiß es, wo man sie findet. – adminSoftDK

Verwandte Themen