2009-12-11 17 views
88

Estoy trabajando sin mezcla de expresiones y solo usando el editor XAML en vs2010. Dejando de lado la sabiduría de esto, cada vez veo más la necesidad de un enlace de datos en tiempo de diseño. Para casos simples, la propiedad FallbackValue funciona muy bien (Textboxes y TextBlocks, etc.). Pero especialmente cuando se trata de ItemsControl y similares, uno realmente necesita datos de muestra para ser visibles en el diseñador para que pueda ajustar y modificar los controles y las plantillas de datos sin tener que ejecutar el ejecutable.¿Qué enfoques están disponibles para los datos ficticios de tiempo de diseño en WPF?

Sé que ObjectDataProvider permite vincular a un tipo, y así puede proporcionar datos de tiempo de diseño para visualizar, pero luego hay algunos malabares para permitir que los datos reales en tiempo de ejecución se vinculen sin desperdiciar recursos cargando cargando tanto el tiempo de diseño, los datos dummied y los enlaces de tiempo de ejecución.

Realmente lo que quiero es tener, por ejemplo, "John", "Paul", "George" y "Ringo" en el diseñador XAML como elementos de mi artículo ItemsControl, pero tengo datos reales aparece cuando se ejecuta la aplicación.

También sé que Blend permite algunos atributos extravagantes que definen datos de enlace de tiempo de diseño que WPF ignora de manera efectiva en condiciones de tiempo de ejecución.

Así que mis preguntas son:

1. ¿Cómo puede aprovechar fijaciones de tiempo de diseño de colecciones y los datos no triviales en el diseñador estudio XAML visual y luego cambiar a tiempo de ejecución fijaciones sin problemas?

2. ¿Cómo han resuelto otros este problema de tiempo de diseño frente a tiempo de ejecución? En mi caso, no puedo usar fácilmente los mismos datos para ambos (como sería posible con, por ejemplo, una consulta de base de datos).

3. ¿Se combinan sus alternativas de expresión que podría usar para el diseño XAML integrado en datos? (Sé que hay algunas alternativas, pero quiero específicamente algo que pueda usar y ver los datos de muestra unida, etc?)

Respuesta

112

Usando VS2010 puede usar Design-Time attributes (funciona tanto para SL como para WPF).Por lo general tienen un conjunto de datos de código simulacro de todos modos por lo que es sólo una cuestión de:

  • Adición de la declaración de espacio de nombres

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    
  • Añadiendo el contexto de datos simulada a la ventana de recursos/control

    <UserControl.Resources> 
        <ViewModels:MockXViewModel x:Key="DesignViewModel"/> 
    </UserControl.Resources> 
    
  • Configuración del contexto de datos en tiempo de diseño

    <Grid d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ... 
    

Funciona bastante bien.

+1

Sí. Creo que este es el ganador nuevo y claro. Las otras cosas fueron soluciones temporales, esto es más "compatible oficialmente" – el2iot2

+2

Si tiene problemas para usar 'd: DataContext' puede encontrar algo de ayuda en esta pregunta: http://stackoverflow.com/questions/8303803/setting-design- time-datacontext-on-a-window-is-giving-a-compiler-error –

+24

¿Este ejemplo no causaría que una instancia de MockXViewModel se cargue en sus recursos para una versión de lanzamiento? ¿No es esto una preocupación? – jpierson

4

Karl Shifflett describe un enfoque que se debe trabajar igual de bien para VS2008 y VS2010:

Viewing Design Time Data in Visual Studio 2008 Cider Designer in WPF and Silverlight Projects

Laurent Bugnion tiene un enfoque similar que se centra en Expression Blend. Es podría funcionar para VS2010, pero no he confirmado esto todavía.

Simulating data in design mode in Microsoft Expression Blend

+0

gracias por traer esto a mi atención. Me gusta el concepto DesignAndRunTimeDataContext. – el2iot2

+1

Karl Shifflett tiene un artículo actualizado para Visual Studio 2010: [Datos de muestra en WPF y Silverlight Designer] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/sample-data-in -the-wpf-and-silverlight-designer.aspx # consuming) – totorocat

+0

La esencia del contenido del enlace realmente debería ser editada en la respuesta, especialmente dado que el primer enlace está ahora muerto. – Lauraducky

4

Tal vez las nuevas funciones de tiempo de diseño de Visual Studio 2010 y Expression Blend 4 son una opción para usted.

Cómo funciona se muestra en la aplicación de la muestraBookLibrary del WPF Application Framework (WAF). Descargue la versión .NET4.

+0

Gracias por el enlace. ¿Hay algún archivo de código o construcción en particular que debería estar mirando para ver el enfoque? (una breve descripción sería genial) – el2iot2

+0

Eche un vistazo al proyecto BookLibrary.Presentation. En este proyecto, encontrará la carpeta "DesignData" que utilizan los UserControls en la carpeta "Vistas". – jbe

+1

+1. Solo eché un vistazo a esto.Para cualquier persona interesada, el modelo de vista de datos de muestra se declara en XAML y se hace referencia a través de d: DataContext = "{d: DesignData Source = ../DesignData/SampleLendToViewModel.xaml}" – RichardOD

2

que utilizan este enfoque para la generación de datos en tiempo de diseño con .NET 4.5 y Visual Studio 2013.

tengo sólo un modelo de vista. El modelo de vista tiene una propiedad IsInDesignMode que indica si el modo de diseño está activo o no (consulte la clase ViewModelBase). Luego puede configurar sus datos de tiempo de diseño (como llenar un control de elementos) en el constructor de modelos de vista.

Además, no cargaría datos reales en el constructor de modelos de vista, esto podría ocasionar problemas en el tiempo de ejecución, pero la configuración de datos para el tiempo de diseño no debería ser un problema.

public abstract class ViewModelBase 
{ 
    public bool IsInDesignMode 
    { 
     get 
     { 
      return DesignerProperties.GetIsInDesignMode(new DependencyObject()); 
     } 
    } 
} 

public class ExampleViewModel : ViewModelBase 
{ 
    public ExampleViewModel() 
    { 
     if (IsInDesignMode == true) 
     { 
      LoadDesignTimeData(); 
     } 
    } 

    private void LoadDesignTimeData() 
    { 
     // Load design time data here 
    }  
} 
1

Similar a la respuesta más valorados, pero mejor en mi opinión: Puede crear una propiedad estática para devolver una instancia de datos de diseño y referenciarlo directamente de XAML de este modo:

<d:UserControl.DataContext> 
    <Binding Source="{x:Static designTimeNamespace:DesignTimeViewModels.MyViewModel}" /> 
</d:UserControl.DataContext> 

Este evita la necesidad de usar UserControl.Resources. Su propiedad estática puede funcionar como una fábrica que le permite construir tipos de datos no triviales, por ejemplo, si no tiene un ctor predeterminado, puede llamar a una fábrica o contenedor aquí para inyectarlo en dependencias apropiadas.

4

Como una amalgama de la respuesta aceptada por Goran y el excelente comentario de Rene.

  • Agregue la declaración del espacio de nombres. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  • Consulte su contexto de datos de tiempo de diseño desde el código.
    <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...

+1

Estoy tentado de marcar esto como la nueva respuesta, pero tal vez podamos incluir el resto de los detalles. – el2iot2

+0

Esto necesita más visibilidad, o necesita ser arrastrado a la respuesta aceptada. Es una solución mucho mejor. – Lauraducky

Cuestiones relacionadas