IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

TreeView dans un datagrid


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut TreeView dans un datagrid
    Bonjour,

    je débute en wpf, je dispose d'une liste d'objet A qui contient une liste d'objets B qui, elle aussi, contient une autre liste d'objets C

    A => List_B
    B => List_C

    Je voudrai afficher dans une colonne de DataGrid un TreeView dont le contenu sera comme ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
     +Objet_A1
                   Objet_B1
                   Objet_B2
                  + Objet_B3
                               Objet_C1
                               Objet_C2
                               Objet_C3
     
      +Objet_A2
                   Objet_B3
                   Objet_B4
                  + Objet_B5
                               Objet_C4
                               Objet_C5
                               Objet_C6

    Peut on le faire avec XAML sans pour autant passer au code ?

    Chaque Objet A,B et C dispose de sa propre classe.

    Quelqu'un peut m'aider ?

    Merci

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Tu peux utiliser une DataGridTemplateColumn et dans le template utiliser un TreeView.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Pragmateek Voir le message
    Tu peux utiliser une DataGridTemplateColumn et dans le template utiliser un TreeView.
    Merci d'avoir répondu, j'arrive à mettre le TreeView mais j'arrive pas à le remplir... J'obtiens le TreeView vide.

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Il faut indiquer l'ItemsSource du TreeView en la bindant à la propriété représentant l'objet "A" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <TreeView ItemsSource="{Binding proprieteDontLeTypeEstAServantDeRacine}">
    </TreeView>
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Pragmateek Voir le message
    Il faut indiquer l'ItemsSource du TreeView en la bindant à la propriété représentant l'objet "A" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <TreeView ItemsSource="{Binding proprieteDontLeTypeEstAServantDeRacine}">
    </TreeView>
    Merci d'avoir repondu;

    Effectivement , c'est ce que je fais, mais j'obtiens pas ce que je veux :

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <DataGridTemplateColumn Header="A" IsReadOnly="True">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
     
                                <TreeView ItemsSource="{Binding A_List}">
                                    <TreeView.ItemTemplate>
                                        <HierarchicalDataTemplate ItemsSource="{Binding B_List}" >
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding B_Id}" />
                                                <TextBlock Text="{Binding B_C_ListCount}" />
                                            </StackPanel>
                                        </HierarchicalDataTemplate>
                                    </TreeView.ItemTemplate>
                                </TreeView>
     
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
    avce ce code j'obtiens une colonne vide.
    Merci de revoir le code

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Il faut plusieurs templates, un par type.

    Voici une façon de faire avec un modèle de données similaire :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    using System.Collections.Generic;
    using System.Windows;
     
    namespace TreeViewInDG
    {
        public class A
        {
            public string Label { get; set; }
            public IList<B> B_List { get; set; }
        }
     
        public class B
        {
            public string Label { get; set; }
            public IList<C> C_List { get; set; }
        }
     
        public class C
        {
            public string Label { get; set; }
        }
     
        public class Entity
        {
            public IList<A> A_List { get; set; }
        }
     
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
     
                dg.ItemsSource = new[]
                {
                    new Entity
                    {
                        A_List = new[]
                        {
                            new A
                            {
                                Label = "A #1",
                                B_List = new[]
                                {
                                    new B
                                    {
                                        Label = "A #1 / B #1",
                                        C_List = new[]
                                        {
                                            new C
                                            {
                                                Label = "A #1 / B #1 / C #1"
                                            },
                                            new C
                                            {
                                                Label = "A #1 / B #1 / C #2"
                                            }
                                        }
                                    },
                                    new B
                                    {
                                        Label = "A #1 / B #2"
                                    },
                                    new B
                                    {
                                        Label = "A #1 / B #2",
                                        C_List = new[]
                                        {
                                            new C
                                            {
                                                Label = "A #1 / B #2 / C #1"
                                            },
                                            new C
                                            {
                                                Label = "A #1 / B #2 / C #2"
                                            }
                                        }
                                    },
                                }
                            }
                        }
                    }
                };
            }
        }
    }

    Et le XAML :
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <Window x:Class="TreeViewInDG.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:TreeViewInDG"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid x:Name="dg">
                <DataGrid.Columns>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TreeView ItemsSource="{Binding A_List}">
                                    <TreeView.Resources>
                                        <HierarchicalDataTemplate DataType="{x:Type local:A}" ItemsSource="{Binding B_List}">
                                            <TextBlock Text="{Binding Label}"></TextBlock>
                                        </HierarchicalDataTemplate>
                                        <HierarchicalDataTemplate DataType="{x:Type local:B}" ItemsSource="{Binding C_List}">
                                            <TextBlock Text="{Binding Label}"></TextBlock>
                                        </HierarchicalDataTemplate>
                                        <DataTemplate DataType="{x:Type local:C}">
                                            <TextBlock Text="{Binding Label}"></TextBlock>
                                        </DataTemplate>
                                    </TreeView.Resources>
                                </TreeView>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Pragmateek Voir le message
    Il faut plusieurs templates, un par type.

    Voici une façon de faire avec un modèle de données similaire :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    using System.Collections.Generic;
    using System.Windows;
     
    namespace TreeViewInDG
    {
        public class A
        {
            public string Label { get; set; }
            public IList<B> B_List { get; set; }
        }
     
        public class B
        {
            public string Label { get; set; }
            public IList<C> C_List { get; set; }
        }
     
        public class C
        {
            public string Label { get; set; }
        }
     
        public class Entity
        {
            public IList<A> A_List { get; set; }
        }
     
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
     
                dg.ItemsSource = new[]
                {
                    new Entity
                    {
                        A_List = new[]
                        {
                            new A
                            {
                                Label = "A #1",
                                B_List = new[]
                                {
                                    new B
                                    {
                                        Label = "A #1 / B #1",
                                        C_List = new[]
                                        {
                                            new C
                                            {
                                                Label = "A #1 / B #1 / C #1"
                                            },
                                            new C
                                            {
                                                Label = "A #1 / B #1 / C #2"
                                            }
                                        }
                                    },
                                    new B
                                    {
                                        Label = "A #1 / B #2"
                                    },
                                    new B
                                    {
                                        Label = "A #1 / B #2",
                                        C_List = new[]
                                        {
                                            new C
                                            {
                                                Label = "A #1 / B #2 / C #1"
                                            },
                                            new C
                                            {
                                                Label = "A #1 / B #2 / C #2"
                                            }
                                        }
                                    },
                                }
                            }
                        }
                    }
                };
            }
        }
    }

    Et le XAML :
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <Window x:Class="TreeViewInDG.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:TreeViewInDG"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid x:Name="dg">
                <DataGrid.Columns>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TreeView ItemsSource="{Binding A_List}">
                                    <TreeView.Resources>
                                        <HierarchicalDataTemplate DataType="{x:Type local:A}" ItemsSource="{Binding B_List}">
                                            <TextBlock Text="{Binding Label}"></TextBlock>
                                        </HierarchicalDataTemplate>
                                        <HierarchicalDataTemplate DataType="{x:Type local:B}" ItemsSource="{Binding C_List}">
                                            <TextBlock Text="{Binding Label}"></TextBlock>
                                        </HierarchicalDataTemplate>
                                        <DataTemplate DataType="{x:Type local:C}">
                                            <TextBlock Text="{Binding Label}"></TextBlock>
                                        </DataTemplate>
                                    </TreeView.Resources>
                                </TreeView>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    Merci pour votre effort,

    Pouvez vous m'éclairer sur DataType="{x:Type local:Object}", afin de mieux comprendre ?

    Merci encore.

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Alors décomposons :
    - DataType : propriété de la classe DataTemplate indiquant quel est le type .Net (représenté par une instance de la classe Type) visé par ce DataTemplate qui sera ainsi automatiquement appliqué aux éléments de ce type (ce qui permet d'avoir du polymorphisme au niveau du rendu),
    - {x:Type} : markup-extension qui génère une instance de Type,
    - local:A : token représentant le type souhaité : "local" c'est le nom du namespace XML correspondant au namespace C# "TreeViewInDG", et "A" le nom du type => c'est l'équivalent de typeof(TreeViewInDG.A) en C#

    Et pourquoi pas simplement DataType="local:A" ?
    Parce que DataType peut aussi désigner un élément XML, donc c'est l'un des cas (le seul?) où il faut expliciter son intention en utilisant la markup-extension TypeExtension.

    Voilà tu sais tout maintenant.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Pragmateek Voir le message
    Alors décomposons :
    - DataType : propriété de la classe DataTemplate indiquant quel est le type .Net (représenté par une instance de la classe Type) visé par ce DataTemplate qui sera ainsi automatiquement appliqué aux éléments de ce type (ce qui permet d'avoir du polymorphisme au niveau du rendu),
    - {x:Type} : markup-extension qui génère une instance de Type,
    - local:A : token représentant le type souhaité : "local" c'est le nom du namespace XML correspondant au namespace C# "TreeViewInDG", et "A" le nom du type => c'est l'équivalent de typeof(TreeViewInDG.A) en C#

    Et pourquoi pas simplement DataType="local:A" ?
    Parce que DataType peut aussi désigner un élément XML, donc c'est l'un des cas (le seul?) où il faut expliciter son intention en utilisant la markup-extension TypeExtension.

    Voilà tu sais tout maintenant.
    Je vous remercie pour votre aide précieuse, si j'arrive à appliquer vos consignes je metterai le post comme résolu.
    Merci encore.

  10. #10
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour
    Le DataGrid.RowDetailsTemplate est plus approprie pour ce cas car il accepte un itemscontrol ce qui permet de fourguer un treeview equipe de son Hierachical DataTemplate....dans la colonne souhaite ou sera seulement un champ de la liste principale..
    code exemple behind.cs du class data exemple (liste de liste herarchique):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections.ObjectModel;
     
    namespace WpfTreeViewInDGV
    {
        public class ClassC
        {
            public ClassC(string s)
            {
                ID = s;
            }
            public string ID { get; set; }
     
        }
        //ce class necessite un datatemplate specifique
        //car il a un champ en plus 
        public class ClassB
        {
            public ClassB(string s,int n)
            {
                ID = s;
                Numero = n;
                Liste = new ObservableCollection<ClassC>();
            }
            public string ID { get; set; }
            public int Numero { get; set; }
            public ObservableCollection<ClassC> Liste { get; set; }
        }
        public class ClassA
        {
            public ClassA(string s)
            {
                ID = s;
                Liste = new ObservableCollection<ClassB>();
            }
            public string ID { get; set; }
            public ObservableCollection<ClassB> Liste { get; set; }
        }
     
        public class ListeDesListes : ObservableCollection<ClassA> 
        {
            private ClassC cl;
            private ClassB bl;
            private ClassA al;
            public ListeDesListes()
            { 
                for (int i = 0; i < 5; i++)
                {
                    al = new ClassA("A"+i.ToString());
                    for (int j = 0; j < 6; j++)
                    {
                        bl = new ClassB ("B"+j.ToString(),(j+1)*10);
                        for (int k = 0; k < 4; k++)
                        {
                            cl = new ClassC("C" + j.ToString());
                            bl.Liste.Add(cl);
                        }
                        al.Liste.Add(bl);
                    }
                    this.Add(al);
                }
     
            }
        }
     
    }
    code xaml du winform utilisateur:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <Window x:Class="WpfTreeViewInDGV.WinRowDetailsTreeView"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:local="clr-namespace:WpfTreeViewInDGV"
            Title="WinRowDetailsTreeView" Height="300" Width="300">
        <Window.Resources>
            <local:ListeDesListes x:Key="l"></local:ListeDesListes>
            <!--expand the  TreeViewItem-->
            <Style TargetType="TreeViewItem">
                <Setter Property="IsExpanded" Value="True"/>
            </Style>
            <HierarchicalDataTemplate 
                    x:Key="treeviewTemplate"
                    ItemsSource ="{Binding Path=Liste}">
                <StackPanel Orientation="Horizontal" >
                    <TextBlock Background="Red" Foreground="White"  Margin="5" Text="{Binding Path=ID}"/>
                    <TextBlock Background="Yellow" Foreground="Blue"  Margin="5" Text="{Binding Path=Numero}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
     
        </Window.Resources>
        <Grid>
            <DataGrid ItemsSource="{Binding Source={StaticResource l}}" 
                      AutoGenerateColumns="True" 
                      RowDetailsVisibilityMode="VisibleWhenSelected">
     
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <TreeView  
                            ItemsSource="{Binding Liste}" 
                            ItemTemplate="{StaticResource treeviewTemplate}">
                        </TreeView>
                        <!--en general un itemscontrol:listbox,combobox,listview et...-->
                        <!--<ItemsControl
                            ItemsSource="{Binding taPropListe}" 
                            ItemTemplate="{StaticResource tonTemplate}" />-->
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid> 
        </Grid>
    </Window>
    Bon code...

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 74
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    Bonjour
    Le DataGrid.RowDetailsTemplate est plus approprie pour ce cas car il accepte un itemscontrol ce qui permet de fourguer un treeview equipe de son Hierachical DataTemplate....dans la colonne souhaite ou sera seulement un champ de la liste principale..
    code exemple behind.cs du class data exemple (liste de liste herarchique):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections.ObjectModel;
     
    namespace WpfTreeViewInDGV
    {
        public class ClassC
        {
            public ClassC(string s)
            {
                ID = s;
            }
            public string ID { get; set; }
     
        }
        //ce class necessite un datatemplate specifique
        //car il a un champ en plus 
        public class ClassB
        {
            public ClassB(string s,int n)
            {
                ID = s;
                Numero = n;
                Liste = new ObservableCollection<ClassC>();
            }
            public string ID { get; set; }
            public int Numero { get; set; }
            public ObservableCollection<ClassC> Liste { get; set; }
        }
        public class ClassA
        {
            public ClassA(string s)
            {
                ID = s;
                Liste = new ObservableCollection<ClassB>();
            }
            public string ID { get; set; }
            public ObservableCollection<ClassB> Liste { get; set; }
        }
     
        public class ListeDesListes : ObservableCollection<ClassA> 
        {
            private ClassC cl;
            private ClassB bl;
            private ClassA al;
            public ListeDesListes()
            { 
                for (int i = 0; i < 5; i++)
                {
                    al = new ClassA("A"+i.ToString());
                    for (int j = 0; j < 6; j++)
                    {
                        bl = new ClassB ("B"+j.ToString(),(j+1)*10);
                        for (int k = 0; k < 4; k++)
                        {
                            cl = new ClassC("C" + j.ToString());
                            bl.Liste.Add(cl);
                        }
                        al.Liste.Add(bl);
                    }
                    this.Add(al);
                }
     
            }
        }
     
    }
    code xaml du winform utilisateur:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <Window x:Class="WpfTreeViewInDGV.WinRowDetailsTreeView"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:local="clr-namespace:WpfTreeViewInDGV"
            Title="WinRowDetailsTreeView" Height="300" Width="300">
        <Window.Resources>
            <local:ListeDesListes x:Key="l"></local:ListeDesListes>
            <!--expand the  TreeViewItem-->
            <Style TargetType="TreeViewItem">
                <Setter Property="IsExpanded" Value="True"/>
            </Style>
            <HierarchicalDataTemplate 
                    x:Key="treeviewTemplate"
                    ItemsSource ="{Binding Path=Liste}">
                <StackPanel Orientation="Horizontal" >
                    <TextBlock Background="Red" Foreground="White"  Margin="5" Text="{Binding Path=ID}"/>
                    <TextBlock Background="Yellow" Foreground="Blue"  Margin="5" Text="{Binding Path=Numero}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
     
        </Window.Resources>
        <Grid>
            <DataGrid ItemsSource="{Binding Source={StaticResource l}}" 
                      AutoGenerateColumns="True" 
                      RowDetailsVisibilityMode="VisibleWhenSelected">
     
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <TreeView  
                            ItemsSource="{Binding Liste}" 
                            ItemTemplate="{StaticResource treeviewTemplate}">
                        </TreeView>
                        <!--en general un itemscontrol:listbox,combobox,listview et...-->
                        <!--<ItemsControl
                            ItemsSource="{Binding taPropListe}" 
                            ItemTemplate="{StaticResource tonTemplate}" />-->
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid> 
        </Grid>
    </Window>
    Bon code...
    Merci pour votre aide,

    Est il un moyen d'utiliser uniquement du XAML ?

Discussions similaires

  1. Réponses: 13
    Dernier message: 14/06/2004, 15h35
  2. [VB.NET] Tooltips dans un DataGrid
    Par seemax dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/04/2004, 14h16
  3. Pb d'update dans une DataGrid
    Par bidson dans le forum XMLRAD
    Réponses: 11
    Dernier message: 27/05/2003, 14h11
  4. [VB.NET] Insérer une colonne de CheckBox dans un DataGrid
    Par Manue.35 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/05/2003, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo