¿Qué enfoques están disponibles para los datos ficticios de tiempo de diseño en WPF?


Estoy trabajando sin mezcla de expresiones y solo uso el editor XAML en vs2010. Dejando de lado la sabiduría de esto, veo cada vez más la necesidad de vincular datos en el tiempo de diseño. Para casos simples, la propiedad FallbackValue funciona muy bien (Cuadros de texto y bloques de texto, etc.). Pero especialmente cuando se trata de ItemsControl y similares, uno realmente necesita que los datos de muestra sean visibles en el diseñador para que pueda ajustar y ajustar los controles y las plantillas de datos sin tener que ejecutar el ejecutable.

Lo sé eso ObjectDataProvider permite enlazar a un tipo, y por lo tanto puede proporcionar datos en tiempo de diseño para visualizar, pero luego hay algunos malabares para permitir que los datos reales en tiempo de ejecución se enlacen sin desperdiciar recursos cargando cargando tanto el tiempo de diseño, los datos ficticios y los enlaces en tiempo de ejecución.

Realmente lo que quiero es la capacidad de tener, por ejemplo, "John", "Paul", "George" y "Ringo" aparecen en el diseñador XAML como elementos estilables en mi ItemsControl, pero tienen datos reales aparecen cuando la aplicación ejecutar.

También sé que la mezcla permite algunos atributos sofisticados que definen datos de enlace de tiempo de diseño que WPF ignora efectivamente en condiciones de tiempo de ejecución.

Así que mis preguntas son:

1. ¿Cómo puedo aprovechar los enlaces en tiempo de diseño de colecciones y datos no triviales en visual studio XAML designer y luego cambiar a enlaces en tiempo de ejecución sin problemas?

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

3. ¿Son sus alternativas a la mezcla 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 datos de muestra enlazados, etc.))

Author: el2iot2, 2009-12-11

7 answers

Usando VS2010 puedes usar atributos de tiempo de diseño (funciona tanto para SL como para WPF). Normalmente tengo una fuente de datos simulada de todos modos, por lo que es solo una cuestión de:

  • Añadiendo la declaración de espacio de nombres

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    
  • Añadiendo el contexto de datos simulados a window/control resources

    <UserControl.Resources>
      <ViewModels:MockXViewModel x:Key="DesignViewModel"/>
    </UserControl.Resources>
    
  • Establecer el contexto de datos en tiempo de diseño

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

Funciona bastante bien.

 115
Author: Goran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-04 20:09:51

Como una amalgama de la respuesta aceptada de Goran y el excelente comentario de René.

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

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

 6
Author: John Stritenberger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-03 12:14:10

Karl Shifflett describe un enfoque que debería funcionar igualmente bien para VS2008 y VS2010:

Visualización de Datos de Tiempo de Diseño en Visual Studio 2008 Diseñador de Sidra en Proyectos WPF y Silverlight

Laurent Bugnion tiene un enfoque similar que se centra en la Mezcla de expresiones. podría funcionar para VS2010, pero aún no lo he confirmado.

Simulación de datos en modo diseño en Microsoft Expression Blend

 4
Author: dthrasher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-18 18:46:18

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

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

 4
Author: jbe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-10 09:30:35

Utilizo este enfoque para generar datos de tiempo de diseño con.NET 4.5 y Visual Studio 2013.

Solo tengo un ViewModel. El modelo de vista tiene una propiedad IsInDesignMode que indica si el modo de diseño está activo o no (ver clase ViewModelBase). A continuación, puede configurar los datos de tiempo de diseño (como rellenar un control de elementos) en el constructor view models.

Además, no cargaría datos reales en el constructor de view models, esto puede dar lugar a problemas en 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
    }       
}
 2
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-24 06:26:03

Usando Visual Studio 2017 he estado tratando de seguir todas las guías y preguntas como esta y todavía me enfrentaba a un <ItemsControl> que simplemente no ejecutaba el código que tenía dentro del constructor de un DesignFooViewModel que hereda de FooViewModel. Confirmé la parte "no ejecuté" siguiendo esta guía MSDN"útil" (spoiler: MessageBox depuración). Si bien esto no está directamente relacionado con la pregunta original, espero que ahorre mucho tiempo a otros.

Resulta que no estaba haciendo nada Equivocada. El problema era que mi aplicación necesita ser construida para x64. Como Visual Studio sigue siendo en 2018 un proceso de 32 bits y aparentemente no puede girar un proceso host de 64 bits para la parte del diseñador, no puede usar mis clases x64. Lo realmente malo es que no hay errores que se encuentran en cualquier registro que se me ocurra.

Así que si se tropieza con esta pregunta porque está viendo datos falsos con su modelo de vista de tiempo de diseño (por ejemplo: <TextBlock Text="{Binding Name}"/> aparece Name no importa que establezca la propiedad a) es probable que la causa sea su compilación x64. Si no puede cambiar su configuración de compilación a anycpu o x86 debido a dependencias, considere crear un nuevo proyecto que sea completamente anycpu y no tenga las dependencias (o ninguna dependencia). Así que terminas dividiendo la mayoría o todas, excepto las partes de inicialización del código, de tu proyecto de "Aplicación WPF" en un proyecto de " biblioteca de clases C#".

Para la base de código en la que estoy trabajando creo que esto forzará una separación saludable de preocupaciones a costa de alguna duplicación de código que es probablemente algo positivo neto.

 2
Author: joonas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-02 14:54:45

Similar a la respuesta más valorada, pero mejor en mi opinión: Puede crear una propiedad estática para devolver una instancia de datos de diseño y referenciarla directamente desde XAML de la siguiente manera:

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

Esto evita la necesidad de usar UserControl.Resources. Su propiedad estática puede funcionar como una fábrica, lo 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 inyectar las dependencias apropiadas.

 1
Author: Schneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-13 06:16:50