juillet
2011
Ca fait longtemps que j’ai pas fait d’article, alors aujourd’hui petit article sur la façon de binder un ContentControl sur un TreeView.
Le but de cet article est d’élaborer un TreeView contenant des employés, ceux ci étant ordonné selon la hiérarchie de l’entreprise.
namespace TreeViewTest
{
public class Employe
{
public Employe(string nom,string prenom,Employe chef)
{
_nom = nom;
_prenom = prenom;
_chef = chef;
}
private string _nom;
public string Nom
{
get
{
return _nom;
}
set
{
_nom = value;
}
}
private string _prenom;
public string Prenom
{
get
{
return _prenom;
}
set
{
_prenom = value;
}
}
private Employe _chef;
public Employe Chef
{
get
{
return _chef;
}
set
{
_chef = value;
}
}
private List<Employe> _subAlterne;
public List<Employe> SubAlterne
{
get
{
if (_subAlterne == null)
_subAlterne = new List<Employe>();
return _subAlterne;
}
set
{
_subAlterne = value;
}
}
}
}
Ensuite au niveau du code behind de notre MainWindow, affectation des employés.
using System.Windows;
namespace TreeViewTest
{
/// <summary>
/// Logique d'interaction pour MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public static List<Employe> RacineEmploye = new List<Employe>();
public MainWindow()
{
InitializeComponent();
//Entité racine
Employe Racine = new Employe("Dupont","Michel",null);
//Entités SubAlterne
Employe Sub = new Employe("Durand","Henri",Racine);
Employe Sub1 = new Employe("Toto","Toto",Racine);
//Entités SubSubAlterne
Employe SubSub = new Employe("Titi","Titi",Sub1);
Employe SubSub1 = new Employe("Tata","Tata",Sub1);
//Ajout des SubSubAlterne dans la liste
Sub1.SubAlterne.Add(SubSub);
Sub1.SubAlterne.Add(SubSub1);
//Ajout dans la liste racine
Racine.SubAlterne.Add(Sub);
Racine.SubAlterne.Add(Sub1);
RacineEmploye.Add(Racine);
}
}
}
Enfin définition du xaml pour afficher correctement tout ceci. Pour le treeView, on effectue le binding sur la liste principale.
Puis utilisation de la propriété HierarchicalDataTemplate en définissant l’itemsSource sur la liste des SubAlterne.
Enfin pour afficher le détail d’un employé, utilisation d’un ContentControl qui se binde sur le SelectedItem du TreeView.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TreeViewTest"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TreeView x:Name="xTreeViewEmploye" ItemsSource="{x:Static local:MainWindow.RacineEmploye}" Grid.Column="0">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=SubAlterne}">
<TextBlock FontWeight="Bold" Text="{Binding Path=Nom}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
<ContentControl Content="{Binding ElementName=xTreeViewEmploye, Path=SelectedItem}" Grid.Column="1">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:Employe}">
<StackPanel>
<StackPanel Orientation="Horizontal" Height="25">
<TextBlock Text="Nom"/>
<TextBox Text="{Binding Path=Nom}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="25">
<TextBlock Text="Prenom"/>
<TextBox Text="{Binding Path=Prenom}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="25">
<TextBlock Text="Chef"/>
<TextBox Text="{Binding Path=Chef.Nom}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</Grid>
</Window>