2011-07-14 10 views
7

Tengo una interfaz de usuario de WPF bastante básica mediante la cual las solicitudes de los usuarios provocan que se abra una nueva pestaña en mi TabControl. TabControl se une a un ObservableCollection<ViewModelBase>Pregunta sobre la gestión de ViewModel (DesignTime Vs Run Time)

agrego casos ViewModel a esta colección, y el contenido de la ficha correspondiente se basa exhibidas en las plantillas de la siguiente manera:

<DataTemplate DataType="{x:Type viewModels:UserUploadsViewModel}"> 
     <userControls:UserUploads /> 
    </DataTemplate> 

Ahora vamos a decir que en el interior de los UserUploads controlar I' Quisiera cable hasta una máquina virtual en XAML para ayudar con el diseño, así:

<UserControl x:Class=".....UserUploads" 
    ..... 
    DataContext="{Binding Source={StaticResource ViewModelLocater}, 
        Path=UserAdministrationViewModel}"> 

esta propiedad devolverá una máquina virtual con servicios en tiempo real en tiempo de ejecución, y una máquina virtual con los datos simulados en tiempo de diseño.

Pregunta: ¿Esto XAML interferirá con lo que estoy haciendo al vincular un contenido TabItems a una instancia de ViewModel, y confiando en el dataTemplate de arriba para mostrar la vista correcta? Si es así, ¿hay alguna forma de lograr que ambos conceptos trabajen juntos?

Respuesta

22

Hay una manera más fácil de hacerlo. Tener un DesignTimeUserAdministrationViewModel y rellenarla con los datos estáticos en el constructor y que se refieren en UserControl como:

<UserControl d:DataContext="{d:DesignInstance designTimeVMs:DesignTimeUserAdministrationViewModel, IsDesignTimeCreatable=True}"> 

esta manera usted tiene un conjunto de datos de prueba de tiempo de diseño unidos a d:DataContext y tiempo de ejecución de datos en vivo con destino a la actual DataContext. Más detalles here.

+0

Eso se ve muy bien. Entonces, si es tiempo de diseño, ese objeto (modelo de vista de tiempo de diseño) estará cableado, pero en tiempo de ejecución ¿no hará nada? –

+1

Sí, se ha agregado para la capacidad de mezcla. – anivas

+0

¡Fantástico! El uso de 'IsDesignTimeCreatable = True' llenará la vista con datos. Si se establece en 'False', solo proporcionará la" forma "de los datos, lo que proporciona un soporte completo de enlace de datos en el diseñador, en lugar de vincularse a ciegas. Además, puede usar un archivo .xaml para especificar completamente datos de ejemplo con '{d: DesignData}'. Consulte [Tutorial: Uso de una instancia de diseño para vincular datos en el Diseñador] (http://msdn.microsoft.com/en-us/library/dd490796 (VS.100) .aspx) y [Tutorial: Uso de datos de muestra en el Diseñador de WPF] (http://msdn.microsoft.com/en-us/library/ee823176 (v = vs.100) .aspx) – cod3monk3y

1

Sí creo que va a interferir con su configuración actual

El ViewModelLocator es una clase estática que devuelve un objeto ficticio en tiempo de diseño, y un modelo de vista estático en tiempo de ejecución. Esto significa que

  • El ViewModelLocator, no su ParentViewModel, contiene sus TabViewModels

  • No se puede tener varias instancias de la misma pestaña (ViewModel) abiertos a la vez

  • no se puede gestionar Abrir/Pestañas cerradas a menos que haga referencia al UserControl, que es una violación del principio MVVM donde ViewModel no conoce la Vista

  • No puede crear copias nuevas del TabViewModel con constructores parametrizados. Por ejemplo, OpenTabs.Add(new CustomerViewModel(CustomerId));

¿Quizás una alternativa podría ser un convertidor? ¿Uno que devuelve un objeto estático si está en tiempo de diseño, o el objeto vinculado durante el tiempo de ejecución? Nunca lo he probado, pero en teoría debería funcionar :)

1

El construido en MS cosas no es malo, pero otra alternativa más elegante y en buenas condiciones estructurales, que estoy ocupado incorpora en mi proyecto es: http://msdn.microsoft.com/en-us/magazine/dn169081.aspx

Básicamente, se utiliza el kit de herramientas de MVVM Light con el contenedor SimpleIoc se viene con y puede proporcionar datos para los siguientes tres escenarios:

Tiempo de diseño, tiempo de ejecución y tiempo de prueba.

Mejor aún, el objetivo de MVVM Light es que tus cosas sean directamente editables en Blend y hay toda una serie de videos y blogs y aplicaciones de muestra que describen todo. Desearía haberlo encontrado antes en mis exploraciones de WPF.