Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

Tout sur WPF, LINQ, C# et .NET en général !

Actualités

[WPF] Comment changer le template d'un contrôle en fonction de ses données ?

Il est parfois intéressant de pouvoir choisir le template d'un contrôle, en fonction de ce qu'il contient Smile

Par exemple, prenez le code suivant:

<Grid>

   <ListBox x:Name="lb">

      <TextBlock Text="1" />

      <TextBlock Text="2" />

      <TextBlock Text="3" />

      <TextBlock Text="4" />

      <TextBlock Text="5" />

      <TextBlock Text="6" />

      <TextBlock Text="7" />

      <TextBlock Text="8" />

      <TextBlock Text="9" />

      <TextBlock Text="10" />

   </ListBox>

</Grid>

Imaginez maintenant que vous aimeriez être en mesure de pouvoir afficher les éléments de votre ListBox différent, en fonction de leur parité par exemple.

Pour faire cela, il va vous falloir passer par un DataTemplateSelector: il s'agit d'une classe permettant de choisir le DataTemplate à appliquer en fonction des données de votre objet.

Pour que cela soit plus clair, voyons un petit exemple. Commençons par créer 2 DataTemplates:

<DataTemplate x:Key="nombrePaire">

  <TextBlock Text="{Binding Text}" Background="Red" Width="50" />

</DataTemplate>

<DataTemplate x:Key="nombreImpaire">

  <TextBlock Text="{Binding Text}" Background="Blue" Width="50" />

</DataTemplate>

Maintenant, il va nous falloir implémenter notre DataTemplateSelector

public class TemplateSelector : DataTemplateSelector

{

    private DataTemplate m_NombrePaire;

 

    public DataTemplate NombrePaire

    {

        get { return m_NombrePaire; }

        set { m_NombrePaire = value; }

    }

 

    private DataTemplate m_NombreImpaire;

 

    public DataTemplate NombreImpaire

    {

        get { return m_NombreImpaire; }

        set { m_NombreImpaire = value; }

    }   

 

    public override DataTemplate SelectTemplate(object item, DependencyObject container)

    {

        TextBlock it = item as TextBlock;

 

        if (Convert.ToInt32(it.Text) % 2 == 0)

        {

            return NombrePaire;

        }

        else

        {

            return NombreImpaire;

        }

    }

}

La partie la plus importante de cette classe est la surchage de la méthode SelectTemplate. En effet, c'est dans cette surcharge que nous allons récupérer l'objet en cours, analyser ses propriétés et sélectionner le bon DataTemplate.

Une fois que cela est fait, il ne nous reste plus qu'à utiliser notre DataTemplateSelector. Pour cela, mettez le code adéquat dans les ressources de votre application:

<!-- cc est le namespace: xmlns:cc="clr-namespace:TestTemplateSelector" -->

<cc:TemplateSelector x:Key="templateSelector" NombrePaire="{StaticResource nombrePaire}" NombreImpaire="{StaticResource nombreImpaire}" />

Pour finir, il ne vous reste plus qu'à indiquer à votre contrôle (ici, il s'agit d'une ListBox) qu'il doit utiliser ce  DataTemplateSelector:

<Grid>

 <ListBox x:Name="lb" ItemTemplateSelector="{StaticResource templateSelector}">

    <TextBlock Text="1" />

    <TextBlock Text="2" />

    <TextBlock Text="3" />

    <TextBlock Text="4" />

    <TextBlock Text="5" />

    <TextBlock Text="6" />

    <TextBlock Text="7" />

    <TextBlock Text="8" />

    <TextBlock Text="9" />

    <TextBlock Text="10" />

  </ListBox>

</Grid>

Et le tour est joué:

TestTemplateSelector

Pour ceux que cela intéresse, je vous recommande ce post, de Beatriz Costa: http://www.beacosta.com/2006/01/how-do-i-display-items-in-itemscontrol.html

 

A+

 

PS: Je me suis rendu compte (trop tard malheureusement) que Richard avait déjà posté un article à propos du DataTemplateSelector: désolé Richard, la prochaine fois, je jeterais un oeil à ton site pour être sur de ne pas refaire les mêmes choses que toi Wink

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: lundi 30 juillet 2007 11:41 par Thomas LEBRUN
Classé sous : ,

Commentaires

richardc a dit :

LOL ;-)

# juillet 30, 2007 14:22
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le il y a 18 heures et 53 minutes

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le 10-10-2008, 17:52

- Hello CS par Le Blog de julz le 10-10-2008, 12:26

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le 10-10-2008, 09:35

- MVC Pratique #07 - Un projet concret et le transfert des objets avec les ModelBinders par #Rui le 10-09-2008, 23:39

- SQL Server 2008 : Certifié - TS Admin (70-432) par SQL Server vu par Christian Robert le 10-09-2008, 10:58

- [WPF] Comment changer la couleur utilisée pour sélectionner les éléments d’un ItemsControl ? par Thomas Lebrun le 10-09-2008, 10:49

- Hello World! par Hamid's Place le 10-08-2008, 23:38

- SQL Profiler - Configuration pour un développeur - tracer les requêtes SQL de votre application par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-08-2008, 15:52

- Monitoring et Patron de méthode par Le blog de Marc Ranchin le 10-08-2008, 10:22