2010-04-18 2 views
5

donc dans les exemples MVVM classiques ive vu Les définitions DataTemplate sont utilisées pour mapper View Models to Views, quelle est la manière standard de le faire dans MVVM Light framework, et où les cartographies devraient-elles être situées? Voici des exemples de ce que je fais maintenant et de ce dont je parle, la miscibilité est importante pour moi!Quelle est la convention standard pour définir une vue imbriquée: mappage viewmodel dans MVVM Light

fenêtre principale:

<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> 

Dans le code ci-dessus, ma classe RootViewModel a une instance de la ApplicationManagementViewModel de classe avec le même nom de la propriété:

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

I Référence du ResourceDictionary « ViewMappings.xaml "pour spécifier comment mon modèle de vue est représenté en tant que vue.

<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> 

Est-ce que je devrais faire des choses comme ça en utilisant ViewModelLocator? Qu'en est-il des collections de modèles de vue?

+0

Je réalise que l'un des gros problèmes avec MVVM est un manque d'une méthodologie unifiée. – Firoso

+0

Je ne pense pas que ce soit un problème de MVVM en soi. C'est un modèle, avec plusieurs implémentations. Pareil avec MVC ou autres. Je ne considère pas cela comme un problème, cela dépend vraiment de la situation et du problème que vous essayez de résoudre. – LBugnion

+0

J'ai des questions très similaires. Donc, les DataTemplates sont assez bons pour WPF? Je veux un type de région de Prism, mais sans Prism. – nportelli

Répondre

4

La méthode que vous utilisez (avec DataTemplates implicitement typé) fonctionne correctement dans WPF, mais malheureusement, elle ne fonctionne pas dans Silverlight. C'est l'une des raisons pour lesquelles je préfère utiliser une méthode plus explicite qui fonctionne dans les deux mondes. De plus, les DataTemplates typés implicitement peuvent être un peu déroutants, car il n'est pas toujours très clair d'où vient le template. Cela peut rendre le travail de l'intégrateur très difficile à certains moments, en particulier pour les petites modifications de l'interface utilisateur (été là, fait que :)

Il n'y a aucune obligation d'utiliser le ViewModelLocator dans MVVM Light, c'est juste une façon que fonctionne bien et est assez facile à comprendre (pour les personnes lisant le code qui ne connaissent pas les subtilités de WPF/SL). Au final, c'est une question de préférence, mais dernièrement, le pattern ViewModelLocator semble gagner en popularité (voir par exemple ce post où un ViewModelLocator générique est utilisé avec MEF).

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

Enfin, permettez-moi d'ajouter que je ne suis pas très satisfait de la mise en œuvre actuelle du ViewModelLocator dans MVVM Lumière, et je veux proposer une solution beaucoup plus générique dans la prochaine version.

+0

le lien est cassé – vidstige

Questions connexes