wpf - Haciendo una mezcla de datos
datatemplate expression-blend (2)
¿Cómo puedo hacer una placa de datos para una combinación de ViewModel (que se pueda diseñar en una combinación de expresiones)? Cuando voy a recursos e intento editar la plantilla de datos directamente, todo lo que veo en el Drawingborad es un rectángulo en blanco. Esto se debe a que DataTemplate no está vinculado a nada. Por supuesto, puedo crear un UserControl y crear algunos datos de tiempo de diseño en el código para ver la plantilla, pero ahora tendría que alternar entre el recurso (para editar) y el control de usuario (para ver el resultado de mi edición). ¿No hay una forma más directa de editar y ver mi plantilla de datos?
Esta estrategia le permitirá ver cómo funcionará la plantilla de datos mientras la edita directamente, sin embargo, no podrá ver el resultado en ninguna vista que utilice esa plantilla de datos a menos que realmente ejecute la aplicación. Esta es una limitación de Blend en este momento debido al hecho de que no parecen estar utilizando Mocks, sino que son objetos de reemplazo completos. Si la mezcla agrega alguna vez la capacidad de crear una nueva fuente de datos falsos haciendo clic en "Nueva fuente de datos -> Basado en objeto referenciado -> MyCustomerObject", entonces estará en el negocio.
Si quiero usar simulaciones de ViewModel reales, supongo que es la mejor manera de crear instancias reales de ViewModel y las referencias con d: DataContext (por ejemplo, usando un ObjectDataProvider o x: Static)
Es un poco difícil de usar, pero Blend tiene una característica llamada "Datos en tiempo de diseño" que puede ayudarlo. Es difícil comenzar al principio, pero una vez que haces algunos es bastante fácil. También te obliga a un patrón agradable para DataContext.
Aquí hay un buen enlace sobre el tema: http://www.robfe.com/2009/08/design-time-data-in-expression-blend-3/
Aquí hay algunos extractos de elección:
En tamaños de tiempo de diseño
... las propiedades de tiempo de diseño pueden ser ignoradas por otras herramientas y se ignoran en el tiempo de ejecución (mc: Ignorable especifica que el espacio de nombres con el prefijo "d" puede ser ignorado).
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
Expression Blend usa dos propiedades de tiempo de diseño (d: DesignWidth, d: DesignHeight) para especificar un tamaño para un control que se usará en tiempo de diseño ...
Fuentes de datos en tiempo de diseño
Me tropecé con d: Datacontext cuando estaba jugando con Blend 3 e intenté agregar una "fuente de datos en vivo" a mi ventana. Pensé que iba a comportarse como la forma antigua de configurar un DataContext, pero cuando ejecuté mi aplicación, ¡no había datos! ...
Entonces el resultado es que ahora podemos escribir código como este:
... <Grid ... DataContext="{StaticResource GameDataSource}" d:DataContext="{StaticResource DesignTime_DateDataSource}">
Tenga en cuenta que esto es para Blend 3 si desea asistencia de primera mano para estas funciones. Son bastante buenos, incluso hay un diseñador para los datos en tiempo de diseño, aunque todavía no he analizado esas características.
Aplicando a las plantillas de datos
Esto es algo que me inventé, pero parece funcionar. Aquí estoy usando la función de datos en tiempo de diseño para extraer datos en d: DataContext del elemento visual. Tendría que hacer esto para cada elemento de nivel superior que necesitara un conjunto de DataContext .
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<!-- Resource dictionary entries should be defined here. -->
<DataTemplate x:Key="MyTemplate">
<TextBlock Text="{Binding Text}" d:DataContext="{StaticResource SampleDataSource}" />
</DataTemplate>
</ResourceDictionary>
La sintaxis de enlace es un poco más explícita si está utilizando una DataTemplate con un conjunto de DataType, pero sigue funcionando:
<DataTemplate DataType="{x:Type vm:MyViewModel}" >
<TextBlock Text="{Binding Text}"
d:DataContext="{Binding Source={StaticResource SampleDataSource}}" />
</DataTemplate>
Esta estrategia le permitirá ver cómo funcionará la plantilla de datos mientras la edita directamente , sin embargo, no podrá ver el resultado en ninguna vista que utilice esa plantilla de datos a menos que realmente ejecute la aplicación. Esta es una limitación de Blend en este momento debido al hecho de que no parecen estar utilizando Mocks, sino que son objetos de reemplazo completos. Si la mezcla agrega alguna vez la capacidad de crear una nueva fuente de datos falsos haciendo clic en "Nueva fuente de datos -> Basado en objeto referenciado -> MyCustomerObject", entonces estará en el negocio.
Es posible que pueda superar esta limitación con algunos trucos de propiedad propios adjuntos, pero en el mejor de los casos sería difícil.
Alternativa
Una alternativa que funcionará en cada situación, pero es un poco más incómoda de configurar, es configurar StaticResources que intercambia datos falsos por datos reales durante el tiempo de ejecución, pero en el diseñador muestra datos de muestra estáticos.
Aquí hay un excelente artículo de Karl Shifflett que incluye algunas de estas técnicas y algunos videos: http://karlshifflett.wordpress.com/2008/10/11/viewing-design-time-data-in-visual-studio-2008-cider-designer-in-wpf-and-silverlight-projects/
Espero que esto ayude, Anderson