2012-05-24 8 views
5

El suministro de datos en tiempo de diseño para el DataContext es fácil con el uso de d:DataContext pero ¿qué pasa con las propiedades de control que se hace referencia {TemplateBinding} o {RelativeSource TemplatedParent} de Style.Template?datos en tiempo de diseño para ControlTemplate

¿Debo completar el control con datos de muestra dentro del evento constructor/Loaded cuando DesignerProperties.GetIsInDesignMode(this) devuelve verdadero? (No se puede hacer esto porque rompería la experiencia de diseño normal).

¿Qué pasa con los controles de terceros que no puedo modificar?

Respuesta

2

Para mis propios controles que suelo hacer algo como:

<Style x:Key="FooStyle> 
    <Setter Property="Template> 
    <Setter.Value> 
     <ControlTemplate TargetType="FooControl"> 
     <Grid d:DataContext="{d:DesignInstance FooDesignTimeData, IsDesignTimeCreatable=True}"> 
      ... guts of control template go here ... 
     </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Donde "FooDesignTimeData" es una clase que proporciona datos en tiempo de diseño en forma apropiada (que implementa la interfaz de su vista del modelo de tiempo de ejecución es una buena práctica aquí).

No veo por qué esto no funcionaría para un control de terceros también. Es posible que ni siquiera tenga que volver a aplicar el control; es posible que pueda alejarse simplemente especificando el control de terceros dentro de su estilo y dándole un contexto de datos de tiempo de diseño como se especifica anteriormente, pero no he intentado ese escenario. Supongo que tendrá todos estos problemas porque está obligado a utilizar un control que no tiene una gran experiencia de tiempo de diseño (por ejemplo, al proporcionar un Vendor.Controls.Design.dll o Vendor.Controls.Expression.Design. archivo dll).

Para trabajar con TemplateBindings, no tengo una gran solución. Por lo general, creo una página de prueba que muestra mi control y me permite cambiar las plantillas. Durante la integración, tendrá una vista adicional (ya sea dentro de su aplicación o como una aplicación separada) que le permite crear y manipular instancias del control según sea necesario. La acción de activación dirigida GoToStateAction del Blend SDK suele ser útil aquí. Por ejemplo, cree un botón para cada estado visual y luego use el clic incluso para activar una transición a un estado particular. Por lo tanto, puede probar fácilmente todos sus estados más transiciones mientras está vinculado a los datos de prueba. Hacky y realmente no diseña datos de tiempo, pero funciona.

+0

Como he dicho, '{Binding}' es fácil debido a 'd: DataContext' pero estoy detrás de' {TemplateBinding} 's. –

+0

¿Ha intentado hacer lo anterior, pero asignando d: DataContext como parte del estilo? No tengo una gran solución para esta situación: generalmente creo una página de prueba que muestra mi control y me permite cambiar las plantillas. Hacky, pero funciona. –

+0

Esto parece razonable. Tengo que probar esto yo mismo. Pero debe cambiar el XAML para una versión de integración, o puede proporcionar el enlace allí también? –

Cuestiones relacionadas