2013-10-21 9 views
6

Ich entwerfe eine WPF-Anwendung nach MVVM-Muster. In einem UserControl (und in der Tat passiert diese Situation viele Male), da es ziemlich komplex ist, was zum Beispiel TabControl beinhaltet, möchte ich sie in mehrere Unter UserControl teilen. Zum Beispiel, in der "Hauptansicht", nennen wir es MainUC, habe ich eine TabControl, die zwei TabItem hat. Da sowohl TabItem viele UI-Elemente tatsächlich enthält, entwerfe ich zwei UserControl, SubUCA und SubUCB, so sieht das XAML von MainUC wie folgt aus:So initialisieren Sie verschachtelte View (und ViewModel) ohne Verwendung von Abhängigkeit Resolver in WPF/MVVM

<TabControl Name="mainUC" Grid.Row="0" > 
    <TabItem Header="Sub UC A" Name="SubUC1"> 
     <local:SubUCA /> 
    </TabItem> 
    <TabItem Header="Sub UC B" Name="SubUC2"> 
     <local:SubUCB /> 
    </TabItem> 
</TabControl > 

Aber jetzt meine Frage ist: Wie soll ich das Viewmodel (e) veran diese UserControl? Eine Möglichkeit, die ich derzeit verwende, ist nur eine ViewModel-Klasse (MainUC_VM) und die DataContext von MainUC wird auf diese Klasseninstanz gesetzt (beachte, dass ich keine Abhängigkeitsinjektion verwende, also erstelle ich einfach eine Instanz im Code- hinter dem MainUC). Aber auf diese Weise würde die MainUC_VM-Klasse genauso kompliziert werden wie der MainUC. Daher möchte ich das ViewModel auch in mehrere Klassen aufteilen. Zum Beispiel in der MainUC_VM Klasse, kann ich solche Eigenschaften

public SubUCA_VM SubVM1 { get; set; } 
public SubUCB_VM SubVM2 { get; set; } 

jedoch habe, da ich nicht Dependency Injection bin mit (weil unser Team, es zu benutzen nicht entschieden hat), wie ich die SubVM1 und SubVM2 machen werden die DataContext von SubUC1 und SubUC2 jeweils? Ich kann nicht einen in der Code-Behind SubUCA und SubUCB instanziieren, da sie andere als die Eigenschaft Mitglieder in der MainUC_VM wären. Einige Möglichkeiten

ich denken kann, sind 1) die SubUCA_VM und SubUCB_VM Klassen Singleton machen (die wie das gleiche Verhalten von Dependency Injection ist mit zB MEF in der Standardeinstellung), oder 2) mit EvengAggregator die instantiate des benachrichtigen Objekt. Aber beides scheint meiner Meinung nach unnötige Komplexität hinzuzufügen. Bedeutet dies, dass die Abhängigkeitsinjektion fast ein Muss ist, um MVVM zu nutzen? Gibt es jemals einen Weg, dies ohne Verwendung von DI zu erreichen?

Antwort

4

Sie können implizite Datenvorlagen verwenden, um Ihre Daten (VM) mit Ihren Ansichten zu verknüpfen. Definieren Sie zunächst die Datenvorlagen in einem Ressourcenverzeichnis, das für Ihre MainUC verfügbar ist. Dies kann entweder im Benutzersteuerelement selbst oder in den Anwendungsressourcen geschehen. Diese Datenvorlagen weisen WPF an, welche Steuerelemente verwendet werden müssen, wenn Daten eines bestimmten Typs angezeigt werden sollen.

<UserControl.Resources> 
    <DataTemplate TargetType="{x:Type local:SubUCA_VM}"> 
     <local:SubUCA /> 
    </DataTemplate> 
    <DataTemplate TargetType="{x:Type local:SubUCB_VM}"> 
     <local:SubUCB /> 
    </DataTemplate> 
</UserControl.Resources> 

binden Sie dann den Inhalt der Registerkarten für das Kind VMs:

<TabControl Name="mainUC" Grid.Row="0" > 
    <TabItem Header="Sub UC A" Content="{Binding SubVM1}" /> 
    <TabItem Header="Sub UC B" Content="{Binding SubVM2}" /> 
</TabControl> 

Alternativ können Sie auch eine Liste in Ihrem Haupt-VM der Kinder VMs haben. Jede untergeordnete VM sollte über eine Title-Eigenschaft verfügen, damit das Registersteuerelement sie für die Kopfzeile verwenden kann. Auf diese Weise kann die Haupt-VM die Benutzeroberfläche dynamisch erstellen. Sie benötigen weiterhin die oben definierten Datenvorlagen.

<TabControl ItemsSource="{Binding Children}" DisplayMemberPath="Title" /> 
+0

Danke! Das ist wirklich nett! – tete

Verwandte Themen