2009-04-23 18 views
7

Estoy empezando con el patrón MVVM en WPF y decidí que la forma más elegante de estructurar mi código era inyectar el modelo de vista en el constructor de la vista.MVVM: ¿Realmente la vista necesita tener un constructor predeterminado?

Esto está muy bien, pero ReSharper da una advertencia en el XAML de que mi vista no tiene un constructor predeterminado. Supongo que esto es así para poder construir mi vista en XAML si es necesario, pero eso es solo una suposición.

¿A qué estoy renunciando al requerir que mi vista tome un modelo de vista en el constructor?

Editar: Mi opinión constructor se ve así:

public ExampleView(ExampleViewModel viewModel) 
{ 
    if (viewModel == null) throw new ArgumentNullException("viewModel"); 
    DataContext = viewModel; 
} 

Respuesta: que se establecieron en la siguiente conexión, donde el espacio de nombres designtime contiene burlado hasta versiones del modelo de vista para el ensayo y tiempo de diseño apoyo.

ExampleView.xaml.cs

public ExampleView() 
{ 
    InitializeComponent(); 
} 

public ExampleView(IExampleViewModel viewModel) 
    : this() 
{ 
    DataContext = viewModel; 
} 

ExampleView.xaml

<UserControl 
    x:Class="Wpf.Examples.ExampleView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:DesignTime="clr-namespace:Wpf.Examples.DesignTime"> 

    <UserControl.DataContext> 
     <DesignTime:ExampleViewModel/> 
    </UserControl.DataContext> 

</UserControl> 

Respuesta

8

Como reconoció correctamente, requerir un constructor no predeterminado le negará el uso de ese control de XAML. Eso también significa que no habrá más soporte de diseño y sus diseñadores probablemente lo odiarán. Finalmente rompes todo tipo de buenos escenarios de enlace de datos. Como usar el control como ItemTemplate.

Como un remedio para el soporte de diseño faltante, sugiero implementar un constructor predeterminado que crea un modelo de vista burlado que no necesita ninguna infraestructura. De esta forma, puede admitir el modo de diseño de forma muy elegante y colocar la vista en un archivo XAML (por ejemplo, para realizar pruebas) hará algo sensato.

Como remedio para el soporte de fijacióndatos faltantes, se debe ponderar si podría ser mejor consumir el modelo de vista a través de la DataContext de su control WPF. Esto es común en WPF y --- por lo que puedo decir --- la forma prevista de pasar el modelo a la vista en WPF.

+0

Estoy configurando el DataContext en el constructor de todos modos, ¿hay un mejor patrón para esto? –

+1

Use una fábrica? Establecer el DataContext manualmente? ¿Crear un constructor predeterminado vacío? –

0

Suponiendo que no es necesario el apoyo del diseñador entonces no veo razones.

0

Para mantener el soporte del diseñador necesita un constructor por defecto. Cuando defines tu propio constructor, básicamente pierdes el constructor predeterminado autogenerado. Simplemente crea un constructor predeterminado explícito y deberías estar bien.

Cuestiones relacionadas