2010-04-18 9 views
5

so in klassischen MVVM Beispiele ive gesehen DataTemplate-Definitionen werden verwendet, um View-Modelle zu Ansichten abzubilden, was ist der Standard Weg, dies in MVVM Light Framework zu tun, und wo sollen die Mappings liegen? Nachfolgend einige Beispiele für das, was ich gerade tue und worüber ich spreche: Mischbarkeit ist mir wichtig!Was ist die Standardkonvention für die Definition von verschachtelten View: viewmodel Mapping in MVVM Light

Hauptfenster:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     x:Class="STS2Editor.MainWindow" 
     Title="{Binding ApplicationTitle, Mode=OneWay}" 
     DataContext="{Binding RootViewModel, Source={StaticResource Locator}}"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Skins/ApplicationSkin.xaml" /> 
       <ResourceDictionary Source="Resources/ViewMappings.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <ContentControl Content="{Binding ApplicationManagementViewModel}" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    </Grid> 
</Window> 

In dem obigen Code, meine RootViewModel Klasse hat eine Instanz der Klasse ApplicationManagementViewModel mit demselben Eigenschaftsname:

public ApplicationManagementViewModel ApplicationManagementViewModel {get {...} set {...} } 

ich verweisen auf die Resource „ViewMappings.xaml "um festzulegen, wie mein Ansichtsmodell als Ansicht dargestellt wird.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:STS2Editor.ViewModel"> 
    <DataTemplate DataType="{x:Type local:ApplicationManagementViewModel}"> 
     <local:ApplicationManagementView/> 
    </DataTemplate> 
</ResourceDictionary> 

sollte ich solche Dinge mit ViewModelLocator tun? Was ist mit Sammlungen von Ansichtsmodellen?

+0

Ich realisiere eines der großen Probleme mit MVVM ist ein LACK einer einheitlichen Methodik. – Firoso

+0

Ich glaube nicht, dass es eine Frage von MVVM per se ist. Es ist ein Muster mit mehreren Implementierungen. Gleiches gilt für MVC oder andere. Ich halte das nicht für ein Problem, es hängt wirklich von der Situation und dem Problem ab, das Sie zu lösen versuchen. – LBugnion

+0

Ich habe sehr ähnliche Fragen. Also DataTemplates sind gut genug für WPF? Ich möchte eine Art von Prismenregionen, aber ohne Prisma. – nportelli

Antwort

4

Die von Ihnen verwendete Methode (mit implizit typisierten DataTemplates) funktioniert in WPF zwar einwandfrei, funktioniert aber in Silverlight leider nicht. Dies ist einer der Gründe, warum ich eine explizitere Methode bevorzuge, die in beiden Welten funktioniert.

Auch implizit typisierte DataTemplates können ein wenig verwirrend sein, weil nicht immer klar ist, woher die Vorlage kommt. Das kann die Arbeit des Integrators manchmal sehr schwierig machen, besonders für kleine Änderungen an der Benutzeroberfläche (dort gewesen, getan das :)

Es gibt keine Verpflichtung, den ViewModelLocator in MVVM Light zu verwenden, es ist nur ein Weg funktioniert gut und ist ziemlich einfach zu verstehen (für Leute, die den Code lesen, der nicht mit den Feinheiten von WPF/SL vertraut ist). Am Ende ist es eine Frage der Präferenz, aber in letzter Zeit scheint das ViewModelLocator-Muster an Popularität zu gewinnen (siehe zum Beispiel diesen Beitrag, wo ein generischer ViewModelLocator zusammen mit MEF verwendet wird).

http://www.johnpapa.net/simple-viewmodel-locator-for-mvvm-the-patients-have-left-the-asylum/

Abschließend möchte ich hinzufügen, dass ich bin nicht sehr zufrieden mit der aktuellen Implementierung des ViewModelLocator in MVVM Licht, und ich möchte eine viel allgemeinere Lösung in der nächsten Version vorzuschlagen.

+0

der Link ist kaputt – vidstige