[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 
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é:
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 
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 :