Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

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

[WPF] Comment sélectionner un item dans un Treeview lié à une Collection/ObservableCollection ?

Lorsque l'on travaille avec un TreeView (ou une ListBox), on est souvent amené à écrire un petit bout de code permettant de sélectionner un item particuler. Avec WPF (Windows Presentation Foundation), on peut tout à faire le faire au moyen d'un code ressemblant à ceci:

TreeViewItem tvi = this.tv.ItemContainerGenerator.ContainerFromIndex(3) as TreeViewItem;

Bien que fonctionnel, ce code pose un problème: en effet, il sous-entends que votre Treeview est remplie de TreeViewItem. Cela peut vous sembler tout à fait normal mais attention, n'oubliez pas qu'avec WPF, la façon dont les contrôles affichent leur contenu est complètement différente: on peut donc retrouver des CheckBox, des Boutons, etc... à la place de ces TreeViewItem.

Prenez le cas où vous utilisez une ObservableCollection que vous allez lier à votre TreeView:

public class Item

{

    public string Name { get; set; }

}

 

public class MyCollection : ObservableCollection<Item>

{

    public ObservableCollection<Item> MyItems { get; set; }

 

    public MyCollection()

    {

        MyItems = new ObservableCollection<Item>();

 

        MyItems.Add(new Item() { Name = "Element 1" });

        MyItems.Add(new Item() { Name = "Element 2" });

        MyItems.Add(new Item() { Name = "Element 3" });

        MyItems.Add(new Item() { Name = "Element 4" });

        MyItems.Add(new Item() { Name = "Element 5" });

    }

}

Vous allez ensuite logiquement instancier votre ObservableCollection et la mettre comme DataContext sur votre TreeView. Cependant, si vous reprenez le code permettant de sélectionner un élément particulier, vous vous rendrez compte qu'il ne fonctionne pas. En effet, le template par défaut, lorsque l'on utilise une collection liée, n'utilise pas de TreeViewItem: le cast que vous réaliser ne fonctionne donc pas (tvi est null).

Pour corriger ce petit "problème", voici la solution que je vous propose: dans les ressources de votre TreeView/Window, créer un DataTemplate comprenant un TreeViewItem incorporant un TextBlock (bindé à la propriété qui vous intéresse) et utilisez-le dans votre TreeView:

<DataTemplate x:Key="template">

    <TreeViewItem IsExpanded="True">

        <TextBlock Text="{Binding Name}" Foreground="Red" />

    </TreeViewItem>

</DataTemplate>

 

<TreeView x:Name="tv" ItemsSource="{Binding Path=MyItems}" ItemTemplate="{StaticResource template}" Margin="0,-2,0,2" />

Ensuite, remplacez le code de sélection d'un élément par celui-ci:

TreeViewItem tvi = this.tv.ItemContainerGenerator.ContainerFromIndex(3) as TreeViewItem;

Et là, plus de problème: l'élément que vous avez indiqué en paramètre de la méthode ContainerFromIndex est sélectionné. Le pourquoi du comment est simple: avant, cette méthode ne renvoyait rien mais grâce à l'utiliation du DataTemplate, nous spécifions explicitement que nous avons un TreeViewItem (comprenant nos informations).

 

Et le tour est joué Smile

 

A+

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 29 octobre 2007 10:30 par Thomas LEBRUN
Classé sous : ,

Commentaires

PlaTyPuS a dit :

Excellent, merci beaucoup!

Je regardais justement ce week-end comment le faire sans y parvenir... j'espère que ta solution fonctionne :-)

+++

# octobre 29, 2007 14:34
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le il y a 10 heures et 1 minutes

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le il y a 11 heures et 15 minutes

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le 07-03-2009, 09:56

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le 07-03-2009, 09:00

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 07-03-2009, 08:45

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15

- SharePoint : Gestion des Erreurs 6398, 7076 et 6482 par Blog Technique de Romelard Fabrice le 07-02-2009, 11:53

- EF avec WPF par Matthieu MEZIL le 07-02-2009, 10:18