2009-06-11 9 views
5

Veo dos maneras de conectar el ViewModel a la Vista. Uno está en XAML y el otro a través de inyección de dependencias en el código subyacente.Conectando el ViewModel a la Vista en Silverlight

¿Qué método es más preferible? Prefiero el método xaml porque no quiero ningún código en el código, ¿pero hay algún problema con uno sobre el otro?

<navigation:Page x:Class="MyNamespace.MyViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModel="clr-namespace:MyNameSpace.MyViewModel" 
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    Title="ViewModel Page" > 

    <navigation:Page.Resources> 
     <ViewModel:MyViewModel x:Key="ViewModel"></ViewModel:MyViewModel> 
    </navigation:Page.Resources> 

    <Grid x:Name="LayoutRoot" Background="White" 
      DataContext="{StaticResource ViewModel}"> 

    </Grid> 
</navigation:Page> 

O

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Navigation; 

namespace MyNamespace 
{ 
    public partial class MyView : Page 
    { 
     public MyView() 
     { 
      InitializeComponent(MyViewModel viewModel); 

      this.DataContext = viewModel; 
     } 
    } 
} 

Respuesta

3

Shawn tiene una buena publicación en View or ViewModel primero. Tener la máquina virtual en el XAML le da Blendability (ver datos de muestra en Blend) que es genial, pero el precio es tener que volver a introducir la información en la Vista. John Papa se ha alejado de este enfoque por esta razón.

Estoy usando la idea de Shawn's Marriage (ver el enlace de arriba).

HTH -Erik

+0

Hmm ... gracias por el enlace. Lo estoy leyendo ahora. Creo que necesito leerlo unas cuantas veces más porque no estoy obteniendo algo. Shawn dice: "En ambos métodos, no me gusta la adherencia de la vista al modelo de vista. Además, ambos implican una relación de uno a uno que, si bien es el caso común, no es siempre el caso. " pero con View-First, las muchas vistas se pueden unir a una máquina virtual. ¿Podría una vista estar vinculada a más de una máquina virtual? hmmm ... de nuevo, supongo que si tu V fuera una cuadrícula simple, podría querer vincularla a diferentes máquinas virtuales. –

+0

Hasta ahora, soy partidario de mantener una relación uno-a-uno entre Vs y VMs. Lo cual no significa que estoy en contra de una jerarquía. Es decir, una vista puede contener sub-vistas, cada una con su propia máquina virtual, y esto parece haber funcionado bastante bien. –

+0

En nuestra aplicación, tenemos una vista de cuadrícula estándar que solo muestra filas de datos. Los datos pueden ser de diferentes ViewModels, por lo que mantenerlo uno a uno no tiene sentido para nosotros. No tiene sentido tener múltiples vistas de cuadrícula cuando todas son iguales excepto por los datos que contiene. –

0

La forma en que has aquí, me gustaría ir con XAML. Hay otras formas de configurar la propiedad DataContext. Si está interesado, mire el marco CAG de Microsoft para WPF.

0

lo he instalado la máquina virtual en el código porque estas pruebas hacen de la vista mucho más fácil. Justin Ángel tiene un gran post para esto:

public partial class Page : UserControl 
{ 
    private PageViewModel _viewModel = new PageViewModel(); 

    public PageViewModel ViewModel 
    { 
     get { return _viewModel; } 
     set { _viewModel = value; } 
    } 

    public Page() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(Page_Loaded); 
    } 

    void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = ViewModel; 
    } 

} 

He encontrado su puesto para ser muy útil para aprender sobre los intricasies de las pruebas que rodea el patrón MVVM.

http://silverlight.net/blogs/justinangel/archive/2009/02/25/silverlight-unit-testing-rhinomocks-unity-and-resharper.aspx

+0

Gracias por el enlace. Todavía lo estoy leyendo ahora, pero prefiero el método de Shawn en este momento. Necesito pasar más tiempo pensando en ello, pero quiero un VM y un V claramente desacoplados. –

4

utilizo una clase que copiar una "pantalla" que se encarga de la tríada MVVM. Comencé cuando una V se inyectaba en una VM, luego una VM como recurso en una V, pero al final el concepto de Pantalla funcionó mejor para mí. Me permite usar una V y una VM sin estar acoplados entre sí. También abstrae otras funcionalidades en mi marco de presentación general. Aquí es el constructor de mi clase de la pantalla como un ejemplo:

public CatalogItemScreen(IUnityContainer container) : base(container) 
    { 
     this.ViewModel = Container.Resolve<ICatalogItemViewModel>(); 
     this.View = Container.Resolve<CatalogItemView>(); 
     this.View.DataContext = this.ViewModel; 
    } 

en cuenta que una máquina virtual se crea en la pantalla, se crea aquí el V y el 2 están unidos entre sí. Esta muestra usa Unity y Prism, pero no es necesario para lograr esto.

Cuestiones relacionadas