2011-11-14 17 views
6

¿Es posible conectar Wire View y ViewModel usando un DataContext declarativo y una plantilla de datos?¿Se está conectando la MVVM View y ViewModel usando el DataContext declarativo para Design-Time y Data Template for Runtime?

Objetivo: Quiero conectar las vistas con un modelo de vista para el tiempo de diseño y otro en el tiempo de ejecución. Actualmente, el uso de un DataContext declarativo para una máquina virtual en tiempo de diseño y una máquina virtual especificada por la plantilla de datos para el tiempo de ejecución no se comporta como se esperaba.

Antecedentes - Hay una variedad de formas de alambre hacia arriba y una vista de modelo de vista entre ellas las siguientes:

A.) declarativa especifique el modelo de vista DataContext dentro de la vista XAML. Esta técnica es útil en Design-Time usando el constructor sin parámetros para pasar datos ficticios.

<UserControl.DataContext> 
    <my: BrowseAssetsViewModel /> 
</UserControl.DataContext> 

B.) programación especifique el modelo de vista, vista y DataContext.

// …Setup code 
BrowseAssetsViewModel viewModel = new BrowseAssetsViewModel(assetRegistry, domains); 
BrowseAssetsView view = new BrowseAssetsView(); 
view.DataContext = viewModel; 

Cuando se utiliza Enfoque B en combinación con el Método A, en tiempo de ejecución WPF anula el DataContext por defecto especificados en el Método A utilizando la versión de la ViewModel con el constructor parametrizado especificado en Approach B.

C.) Definir una plantilla de datos para la asociación View-ViewModel Al asociar una Vista y un ViewModel en App.XAML Application.Resources, WPF puede conectar la Vista correcta en función del tipo de un ViewModel.

<DataTemplate DataType="{x:Type vm: BrowseAssetsViewModel }"> 
    <vw: BrowseAssetsView /> 
</DataTemplate> 

Si una propiedad ViewModel se enlaza a un control de ContentPresenter, WPF podría conectar en marcha la vista correspondiente (en función del tipo del modelo de vista) y colocarlo dentro del ContentPresenter. Esto es útil en el escenario "ViewModel-first" donde se presenta ViewModel y WPF resuelve y cablea la vista correcta inspeccionando el tipo de ViewModel presentado.

Problema - Al utilizar este enfoque C en combinación con el Método A, WPF resuelve el punto de vista correcto, pero parece que a continuación, volver a consultar la vista, llamando al modelo de vista declarativa especificado a través del constructor sin parámetros (Método A) , anulando así la propiedad ViewModel existente.

Pregunta: ¿Existe alguna forma de utilizar estas técnicas (C y A) sin que A sobreescriba involuntariamente la propiedad C ViewModel?

+0

¿Por qué especificó declarativamente un DataContext de ViewModel dentro del XAML de la vista si no desea que esa declaración tenga lugar? –

+0

El objetivo es encontrar una técnica que admita tanto un modelo de tiempo ficticio ViewModels (A) como una resolución de DataTemplate (C) en tiempo de ejecución. –

Respuesta

8

Puede especificar que el DataContext es en caso de un conjunto única solamente en tiempo de diseño , así:

<UserControl ... 
    d:DataContext="{d:DesignInstance my:BrowseAssetsViewModel}" 
> 

Para más detalles, véase Using a DesignInstance... en MSDN.

+3

Además, agregue 'IsDesignTimeCreatable = True' para que aparezca en VS. Por ejemplo, d: DataContext = "{d: DesignInstance Type = local: BrowseAssetsViewModel, IsDesignTimeCreatable = True}" –

+0

Esta respuesta, combinada con IsDesignTimeCreatable = True mencionada en el comentario, resolvió el problema. Gracias a los dos. -Larry –

Cuestiones relacionadas