2010-04-18 10 views
5

por lo que en los ejemplos de MVVM clásicos que he visto Las definiciones de DataTemplate se utilizan para mapear Modelos de Vista a Vistas, ¿cuál es la forma estándar de hacerlo en el marco de MVVM Light? y dónde deberían ubicarse las asignaciones? Los siguientes son ejemplos de lo que estoy haciendo ahora y de lo que estoy hablando, ¡la capacidad de mezcla es importante para mí!¿Cuál es la convención estándar para definir la vista anidada: mapeo de viewmodel en MVVM Light

ventana principal:

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

En el código anterior, mi clase RootViewModel tiene una instancia de la clase ApplicationManagementViewModel con el mismo nombre de la propiedad:

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

que hacen referencia al ResourceDictionary "ViewMappings.xaml "para especificar cómo mi modelo de vista se representa como una vista.

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

¿Debería hacer este tipo de cosas usando ViewModelLocator? ¿Qué hay de las colecciones de modelos de vista?

+0

Me doy cuenta de que uno de los grandes problemas con MVVM es una FALTA de una metodología unificada. – Firoso

+0

No creo que sea un problema de MVVM per se. Es un patrón, con múltiples implementaciones. Lo mismo con MVC u otros. No lo considero un problema, realmente depende de la situación y el problema que está tratando de resolver. – LBugnion

+0

Tengo preguntas muy similares. ¿Entonces DataTemplates es lo suficientemente bueno para WPF? Quiero un tipo de región Prism, pero sin Prism. – nportelli

Respuesta

4

El método que utiliza (con DataTemplates implícitamente tipeado) funciona bien en WPF, pero desafortunadamente no funciona en Silverlight. Esta es una de las razones por las que prefiero usar un método más explícito que funcione en ambos mundos.

Además, las Plantillas de datos implícitamente tipadas pueden ser un poco confusas, porque no siempre está claro de dónde viene la plantilla. Eso puede hacer que el trabajo del integrador sea muy difícil a veces, especialmente para pequeños cambios en la UI (estado allí, hecho eso :)

No hay obligación de usar el ViewModelLocator en MVVM Light, es solo una forma de que funciona bien y es bastante fácil de entender (para las personas que leen el código que no están familiarizadas con las sutilezas de WPF/SL). Al final, es una cuestión de preferencia, pero últimamente el patrón ViewModelLocator parece ganar en popularidad (vea por ejemplo esta publicación donde se usa un ViewModelLocator genérico junto con MEF).

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

Por último, quisiera añadir que no estoy muy satisfecho con la actual aplicación de la ViewModelLocator en MVVM Light, y yo quiero proponer una solución mucho más genérico en la próxima versión.

+0

el enlace está roto – vidstige

Cuestiones relacionadas