2010-05-01 5 views
5

Ho un controllo personalizzato che ha un ContentPresenter che avrà un oggetto arbitrario impostato come contenuto. Questo oggetto non ha alcun vincolo sul suo tipo, quindi voglio che questo controllo visualizzi il suo contenuto in base a qualsiasi modello di dati definito dall'applicazione o dai modelli di dati definiti in Generic.xaml. Se in un'applicazione definisco un modello di dati (senza una chiave perché voglio che venga applicato automaticamente agli oggetti di quel tipo) e io uso il controllo personalizzato associato a un oggetto di quel tipo, il modello di dati viene applicato automaticamente. Ma ho definito alcuni modelli di dati per alcuni tipi nel generic.xaml dove definisco lo stile di controllo personalizzato e questi template non vengono applicati automaticamente. Ecco l'generic.xaml:Come si possono applicare automaticamente i modelli di dati in generic.xaml?

< DataTemplate DataType = "{x: Tipo PredefinedType > < - definizione del modello - > <DataTemplate>

< Stile TargetType =" {x: Type CustomControl}" > < -! stile di controllo - > </stile >

Se imposto un oggetto di tipo "PredefinedType" come contenuto in contentpresenter, il modello di dati non viene applicato. Tuttavia, se funziona, definisco il modello di dati nell'app.xaml per l'applicazione che utilizza il controllo personalizzato.

Qualcuno ha un indizio? Non posso davvero presumere che l'utente del controllo definirà questo modello di dati, quindi ho bisogno di un modo per legarlo con il controllo personalizzato.

risposta

4

Le risorse dichiarate in Generic.xaml vengono richiamate solo se vengono direttamente referenziate dal modello applicato a un controllo (in genere da un riferimento a StaticResource). In questo caso non è possibile impostare un riferimento diretto, quindi è necessario utilizzare un altro metodo per confezionare i DataTemplates con ControlTemplate. È possibile farlo includendoli in una collezione delle risorse più locale, come 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

Ha lavorato bene, grazie :) –

+0

Oltre alla risposta corretta di John, se è necessario utilizzare i modelli è possibile portare altrove loro nel dizionario di controllo risorse unite i dizionari da un altro file XAML. Ciò consente di riutilizzare i modelli sia in generic.xaml che in altre posizioni. –

Problemi correlati