Accueil

WPF : Template selector sur le type

by Jean-Camille Mercier 10. septembre 2013 20:27

Imaginons que vous avez deux objets dérivés qui nécessite une représentation visuelle différente pour l'une partie de leur vue uniquement. Vous aller donc créer un UserControl pour la partie commune et une idée comme une autre serait de faire un TemplateSelector qui renvoi tel ou tel control en fonction du type final de l'objet, quelque chose comme ça :

public class TemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is MonType1)
            return template1;
        if (item is MonType2)
            return template2;
    }
}

Ce n'est pas faut, mais il y a beaucoup plus simple car WPF est capable en natif de sélectionner un template en fonction de l'objet qu'il rencontre dans le DataContext. Il y a juste 2 choses à respecter :

1- Associer les type avec ses controls :

<!--Template selector natif-->
<UserControl.Resources>
   <DataTemplate DataType="{x:Type opyE:Type1}">
      <opyCtrl:Visuel1 />
   </DataTemplate>
   <DataTemplate DataType="{x:Type opyE:Type2}">
      <opyCtrl:Visuel2 />
   </DataTemplate>        
</UserControl.Resources>

2- Il faut ensuite binder le Content à votre DataContext ce qui est plutôt étrange au premier abord :

<ContentControl Content="{Binding}" />

Dans le cas où WPF n'arrive pas à trouver de template pour votre objet, il affichera le ".ToString()", c'est à dire le fullQualifiedName de votre objet. Dans le cas contraire vous verrez apparaître le control demandé sans plus de code : magique !