2010-05-01 14 views
5

Tengo un control personalizado que tiene un ContentPresenter que tendrá un objeto arbitrario como contenido. Este objeto no tiene ninguna restricción sobre su tipo, por lo que quiero que este control muestre su contenido en función de las plantillas de datos definidas por la aplicación o por las plantillas de datos definidas en Generic.xaml. Si en una aplicación defino alguna plantilla de datos (sin una clave porque quiero que se aplique automáticamente a objetos de ese tipo) y utilizo el control personalizado vinculado a un objeto de ese tipo, la plantilla de datos se aplica automáticamente. Pero tengo algunas plantillas de datos definidas para algunos tipos en generic.xaml donde defino el estilo de control personalizado, y estas plantillas no se aplican automáticamente. Aquí está el generic.xaml:¿Cómo se pueden aplicar automáticamente las plantillas de datos en generic.xaml?

< DataTemplate Tipo de datos = "{x: Tipo PredefinedType > < - definición de plantilla - > <DataTemplate>

< Estilo TargetType =" {x: Tipo CustomControl}" > < - estilo de control - > </estilo >

Si configuro un objeto del tipo 'PredefinedType' como el contenido en el contentpresenter, la plantilla de datos no se aplica. Sin embargo, si funciona si defino la plantilla de datos en la aplicación.xaml para la aplicación que está utilizando el control personalizado.

¿Alguien tiene una pista? Realmente no puedo suponer que el usuario del control definirá esta plantilla de datos, así que necesito alguna manera de vincularla con el control personalizado.

Respuesta

4

Los recursos declarados en Generic.xaml solo se extraen si la plantilla que se aplica a un control hace referencia directa (generalmente mediante una referencia de StaticResource). En este caso, no puede configurar una referencia directa, por lo que debe usar otro método para empaquetar las Plantillas de datos con su ControlTemplate. Usted puede hacer esto mediante su inclusión en una colección de recursos más local, como ControlTemplate.Resources:

<Style TargetType="{x:Type local:MyControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyControl}"> 
       <ControlTemplate.Resources> 
        <DataTemplate DataType="{x:Type local:MyDataObject}"> 
         <TextBlock Text="{Binding Name}"/> 
        </DataTemplate> 
       </ControlTemplate.Resources> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" 
         Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}"> 
        <ContentPresenter/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Trabajado muy bien, gracias :) –

+0

Además de respuesta correcta de Juan, si es necesario utilizar las plantillas en otro lugar que puede traer en los recursos de la plantilla de control fusionaron diccionarios de otro archivo XAML. Esto le permite reutilizar plantillas tanto en generic.xaml como en otras ubicaciones. –

Cuestiones relacionadas