2013-05-02 1 views
0

J'utilise souvent des déclencheurs qui dépendent des types de classes locales. Les cas généraux sont les styles de contrôle généraux, qui ont des ContentControls dépendants de la classe. Scénario:wpf Récupère le type d'objet dans les déclencheurs xaml

1) UserControl qui implémente une zone de liste 'MyUserControl'

2) Un grand style listbox, qui applique à un contrôle Listbox à l'intérieur du Usercontrol. Le style a un vide au départ ContentControl (qui est rempli avec une étiquette/StackPanel)

<ContentControl Name="SpecificLabel"></ContentControl> 

3) Il y a Contentcontrols définis pour chaque classe dérivée spécifique

<ControlTemplate x:Key="listbox1Template"> 
    <Label... 
</ControlTemplate> 

<ControlTemplate x:Key="listbox2Template"> 
    <StackPanel... 
</ControlTemplate> 

4) En fonction de la classe dérivée de MyListboxControl, le modèle du ContentControl est choisi par Datatriggers:

<DataTrigger Binding="{Binding ElementName=MyUserControl, Path=DataType}" Value="{x:Type local:MyListbox1}"> 
    <Setter TargetName="SpecificLabel" Property="Template" Value="{StaticResource listbox1template}"/> 
</DataTrigger> 

<DataTrigger Binding="{Binding ElementName=MyUserControl, Path=DataType}" Value="{x:Type local:MyListbox2}"> 
    <Setter TargetName="SpecificLabel" Property="Template" Value="{StaticResource listbox2template}"/> 
</DataTrigger> 

par conséquent, la classe de base offre une propriété DataType:

public Type DataType 
{ 
    get 
    { 
     return this.GetType(); 
    } 
} 

Cela semble qu'il doit y avoir des moyens plus simples. Est-il possible d'obtenir le type local en XAML uniquement, sans utiliser cette propriété?

Répondre

1

Je voudrais utiliser la propriété DataTemplate.DataType et laisser WPF faire le travail. Aucun déclencheur, aucune propriété DataType supplémentaire.

<DataTemplate DataType="{x:Type local:MyListbox1}"> 
    <Label... 
</DataTemplate> 
+0

Dans l'exemple ci-dessus, j'utilise un ContentControl vide et j'insère le modèle via les déclencheurs de données. Alors, qu'est-ce qui ne me paraît pas clair: comment insérer ce datatemplate dans le style listbox? – deafjeff

+0

... en plus, je ne veux pas coder un sélecteur de template codé en C#. Alors quel est le secret? – deafjeff

+0

Vous n'avez pas besoin d'un sélecteur de modèle. Chaque fois que WPF doit afficher l'une de vos classes locales, il utilisera le DataTemplate spécifié. Je ne connais pas votre code mais dans votre cas je suppose que vous pouvez lier ContentControl.Content avec '{Binding}' et selon le type de 'this' il devrait choisir la bonne zone de liste DataTemplate. – LPL