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 avec des items de types différents?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut Treeview avec des items de types différents?
    Tout d'abord bonjour,
    Je voudrais réaliser un treeview qui me permet de lister l'ensemble de mes équipes et pour chaque équipes, l'ensemble des personnes.
    J'ai donc 2 types d'objets différents qui vont venir peupler mon treeview.

    Voici mes classes:
    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
     
    public class Equipe
    {
    	public Equipe(){
    		Child=new List<Equipe>();
    	}
     
    	public Equipe(string name){
    		Child = new List<Equipe>();
    		Name = name;
    	}
     
    	public Equipe(string name, List<Equipe> child, List<Person> persons){
    		Name = name;
    		Child = child;
    		Persons = persons;
    	}
     
    	public string Name { get; set; }
    	public List<Equipe> Child { get; set; }
    	public List<Person> Persons { get; set; }
    }
     
    public class Person
    {
    	public Person()
    	{
    	}
     
    	public Person(string firstname, string lastname)
    	{
    		Firstname = firstname;
    		Lastname = lastname;
    	}
     
    	public string Firstname { get; set; }
    	public string Lastname { get; set; }
    }

    Dans mon treeview j'ai un template qui diffère en fonction du type d'objet
    Code xml : 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
     
    <TreeView ItemsSource="{Binding}" Name="TreeViewTest">
    	<TreeView.Resources>
    		<HierarchicalDataTemplate ItemsSource="{Binding Path=Child, Mode=OneWay}" DataType="{x:Type GUI:Equipe}">
    			<StackPanel Orientation="Horizontal">
    				<Image Source="/equipe.png" Width="16" VerticalAlignment="Center" />
    				<TextBlock Text="{Binding Path=Name}" VerticalAlignment="Center" />
    			</StackPanel>
    		</HierarchicalDataTemplate>
     
    		<HierarchicalDataTemplate ItemsSource="{Binding Path=Persons, Mode=OneWay}" DataType="{x:Type GUI:Person}">
    			<StackPanel Orientation="Horizontal">
    				<Image Source="/person.png" Width="16" VerticalAlignment="Center" />
    				<TextBlock VerticalAlignment="Center">
    					<TextBlock.Text>
    						<MultiBinding StringFormat="{}{0} {1}">
    							<Binding Path="Lastname" />
    							<Binding Path="Firstname" />
    						</MultiBinding>
    					</TextBlock.Text>
    				</TextBlock>
    			</StackPanel>
    		</HierarchicalDataTemplate>
    	</TreeView.Resources>
    </TreeView>

    Je viens le remplir comme ça:
    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
     
    public MainWindow()
    {
    	InitializeComponent();
     
    	var equipe1 = new Equipe("Equipe 1",
    						new List<Equipe>(){
    										 new Equipe("Equipe 1.1"),
    										 new Equipe("Equipe 1.2")
    									 },
    						new List<Person>(){
    										new Person("Francçois","DUPOND"),
    										new Person("Tristan","LAMI")
    						});
     
    	var equipe2 = new Equipe("Equipe 2");
    	var equipeFull = new Equipe("Full", new List<Equipe>() {equipe1, equipe2},new List<Person>() {new Person("Benoit", "LAFFOND")});
     
    	TreeViewTest.DataContext = new List<Equipe>(){equipeFull};
    }

    Et voilà le résultat, aucune personne n'est affichée. Je ne comprend pas vraiment pourquoi. Un coup de main serait il possible?

  2. #2
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Points : 152
    Points
    152
    Par défaut
    Il faut que tu utilises un ItemTemplateSelector qui va servir à rediriger vers le bon template à appliquer. Un exemple ici

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    Je viens de modifier mon code
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <TreeView ItemsSource="{Binding}" Name="TreeViewTest" ItemTemplateSelector="{StaticResource TreeViewEquipeSelector}">

    J'ai rajouter une clé sur mes deux DataTemplate
    Et j'ai le sélecteur suivant.
    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
     
    public class TreeViewEquipeSelector : DataTemplateSelector
    {
    	public override DataTemplate SelectTemplate(object item, DependencyObject container)
    	{
    		FrameworkElement element = container as FrameworkElement; 
    		DataTemplate template = null;
    		if (item != null && item is Equipe)
    			template = element.TryFindResource("TemplateEquipe") as DataTemplate;
    		else if (item != null && item is Person)
    			template = element.TryFindResource("TemplateEquipePerson") as DataTemplate;
    		return template;
    	}
    }

    Pourtant toujours aucune personne qui apparait.
    J'ai mis un point d'arrêt au niveau de
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    else if (item != null && item is Person)
    	template = element.TryFindResource("TemplateEquipePerson") as DataTemplate;
    il n'y rentre jamais


    Je pense que je commais une erreur au niveau de binding.
    Je peuple mon TreeView avec une liste d'Equipe, donc chaque item est une equipe.
    Du coup il rentre dans le Template Equipe et la je bind seulement sur les enfant (/child).
    Je pense que c'est pour ça que je ene vois jamais mais personne.

    Par contre comment arrivr à ce que ej désire, je ne sais pas

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Points : 85
    Points
    85
    Par défaut
    Ton résultat obtenu est normal.
    Ton problème est que ton équipe à pour enfant ET une liste d'équipe ET une liste de personnes.

    Le plus simple reste de faire ceci :
    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
    public class Equipe
    {
    	public Equipe(){
    		Child=new List<Equipe>();
    	}
     
    	public Equipe(string name){
    		Child = new List<Equipe>();
    		Name = name;
    	}
     
    	public Equipe(string name, List<Equipe> child, List<Person> persons){
    		Name = name;
    		Child = child;
    		Persons = persons;
    	}
     
    	public string Name { get; set; }
    	public List<Equipe> Child { get; set; }
    	public List<Person> Persons { get; set; }
    	public IEnumerable<object> Full { get { return Child.Concat<object>(Persons); } }
    }

    Code XML : 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
    <TreeView ItemsSource="{Binding}" Name="TreeViewTest">
    	<TreeView.Resources>
    		<HierarchicalDataTemplate ItemsSource="{Binding Path=Full, Mode=OneWay}" DataType="{x:Type GUI:Equipe}">
    			<StackPanel Orientation="Horizontal">
    				<Image Source="/equipe.png" Width="16" VerticalAlignment="Center" />
    				<TextBlock Text="{Binding Path=Name}" VerticalAlignment="Center" />
    			</StackPanel>
    		</HierarchicalDataTemplate>
     
    		<DataTemplate DataType="{x:Type GUI:Person}">
    			<StackPanel Orientation="Horizontal">
    				<Image Source="/person.png" Width="16" VerticalAlignment="Center" />
    				<TextBlock VerticalAlignment="Center">
    					<TextBlock.Text>
    						<MultiBinding StringFormat="{}{0} {1}">
    							<Binding Path="Lastname" />
    							<Binding Path="Firstname" />
    						</MultiBinding>
    					</TextBlock.Text>
    				</TextBlock>
    			</StackPanel>
    		</DataTemplate>
    	</TreeView.Resources>
    </TreeView>

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    Je ne sais pas si c'est une solution très propre de faire ça, mais une chose est sûre, cela fonctionnement parfaitement.
    Merci beaucoup à vous.

    Petite question Hors sujet:Quelqu'un aurait il un exemple simple montrant comment faire en sorte que les items du treeview prennent toute la largeur du contrôle parce que je n'arrive pas à trouver un truc qui marche.

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Points : 85
    Points
    85
    Par défaut
    Code xml : 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
    <TreeView ItemsSource="{Binding}" Name="TreeViewTest">
    	<TreeView.Resources>
    		<HierarchicalDataTemplate ItemsSource="{Binding Path=Full, Mode=OneWay}" DataType="{x:Type GUI:Equipe}">
    			<StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">
    				<Image Source="/equipe.png" Width="16" VerticalAlignment="Center" />
    				<TextBlock Text="{Binding Path=Name}" VerticalAlignment="Center" />
    			</StackPanel>
    		</HierarchicalDataTemplate>
     
    		<DataTemplate DataType="{x:Type GUI:Person}">
    			<StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">
    				<Image Source="/person.png" Width="16" VerticalAlignment="Center" />
    				<TextBlock VerticalAlignment="Center">
    					<TextBlock.Text>
    						<MultiBinding StringFormat="{}{0} {1}">
    							<Binding Path="Lastname" />
    							<Binding Path="Firstname" />
    						</MultiBinding>
    					</TextBlock.Text>
    				</TextBlock>
    			</StackPanel>
    		</DataTemplate>
    	</TreeView.Resources>
    </TreeView>

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </TreeView>

    J'ai les deux dans un de mes codes, et ça fonctionne bien, donc ça doit à être grâce à l'un de ces codes

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    C'est bizarre, j'ai essayé les deux mais aucun ne fonctionne.

  8. #8
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Points : 85
    Points
    85
    Par défaut
    Ah oui, effectivement, je me souviens maintenant. J'avais mis des stretch partout, et ça ne fonctionnait pas, donc j'avais modifier le ControlTemplate pour qu'il stretch.

    Ce qui donne ceci :
    Code xml : 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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
            <TreeView ItemsSource="{Binding}"
                      Name="TreeViewTest">
                <TreeView.Resources>
                    <Style TargetType="TreeViewItem">
                        <Setter Property="HorizontalContentAlignment"
                                Value="Stretch" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="TreeViewItem">
                                    <StackPanel>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="Auto"
                                                                  MinWidth="19" />
                                                <ColumnDefinition Width="*" />
                                            </Grid.ColumnDefinitions>
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="Auto" />
                                                <RowDefinition />
                                            </Grid.RowDefinitions>
     
                                            <ToggleButton IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
                                                          ClickMode="Press"
                                                          Name="Expander">
                                                <ToggleButton.Style>
                                                    <Style TargetType="ToggleButton">
                                                        <Setter Property="UIElement.Focusable"
                                                                Value="false" />
                                                        <Setter Property="FrameworkElement.Width"
                                                                Value="16" />
                                                        <Setter Property="FrameworkElement.Height"
                                                                Value="16" />
                                                        <Setter Property="Control.Template">
                                                            <Setter.Value>
                                                                <ControlTemplate TargetType="ToggleButton">
                                                                    <Border Padding="5,5,5,5"
                                                                            Background="#00FFFFFF"
                                                                            Width="16"
                                                                            Height="16">
                                                                        <Path Fill="#00FFFFFF"
                                                                              Stroke="#FF989898"
                                                                              Name="ExpandPath">
                                                                            <Path.Data>
                                                                                <PathGeometry Figures="M0,0L0,6L6,0z" />
                                                                            </Path.Data>
                                                                            <Path.RenderTransform>
                                                                                <RotateTransform Angle="135"
                                                                                                 CenterX="3"
                                                                                                 CenterY="3" />
                                                                            </Path.RenderTransform>
                                                                        </Path>
                                                                    </Border>
                                                                    <ControlTemplate.Triggers>
                                                                        <Trigger Property="UIElement.IsMouseOver"
                                                                                 Value="True">
                                                                            <Setter TargetName="ExpandPath"
                                                                                    Property="Shape.Stroke"
                                                                                    Value="#FF1BBBFA" />
                                                                            <Setter TargetName="ExpandPath"
                                                                                    Property="Shape.Fill"
                                                                                    Value="#00FFFFFF" />
                                                                        </Trigger>
                                                                        <Trigger Property="ToggleButton.IsChecked"
                                                                                 Value="True">
                                                                            <Setter TargetName="ExpandPath"
                                                                                    Property="UIElement.RenderTransform">
                                                                                <Setter.Value>
                                                                                    <RotateTransform Angle="180"
                                                                                                     CenterX="3"
                                                                                                     CenterY="3" />
                                                                                </Setter.Value>
                                                                            </Setter>
                                                                            <Setter TargetName="ExpandPath"
                                                                                    Property="Shape.Fill"
                                                                                    Value="#FF595959" />
                                                                            <Setter TargetName="ExpandPath"
                                                                                    Property="Shape.Stroke"
                                                                                    Value="#FF262626" />
                                                                        </Trigger>
                                                                    </ControlTemplate.Triggers>
                                                                </ControlTemplate>
                                                            </Setter.Value>
                                                        </Setter>
                                                    </Style>
                                                </ToggleButton.Style>
                                            </ToggleButton>
                                            <Border x:Name="Bd"
                                                    HorizontalAlignment="Stretch"
                                                    BorderThickness="{TemplateBinding Border.BorderThickness}"
                                                    BorderBrush="{TemplateBinding Border.BorderBrush}"
                                                    Padding="{TemplateBinding Control.Padding}"
                                                    Background="{TemplateBinding Panel.Background}"
                                                    SnapsToDevicePixels="True"
                                                    Grid.Column="1">
                                                <ContentPresenter x:Name="PART_Header"
                                                                  Content="{TemplateBinding HeaderedContentControl.Header}"
                                                                  ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
                                                                  ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}"
                                                                  ContentTemplateSelector="{TemplateBinding HeaderedItemsControl.HeaderTemplateSelector}"
                                                                  ContentSource="Header"
                                                                  HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                                                                  SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                                            </Border>
                                            <ItemsPresenter x:Name="ItemsHost"
                                                            Grid.Column="1"
                                                            Grid.Row="1" />
                                        </Grid>
                                    </StackPanel>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="TreeViewItem.IsExpanded"
                                                 Value="False">
                                            <Setter TargetName="ItemsHost"
                                                    Property="UIElement.Visibility"
                                                    Value="Collapsed" />
                                        </Trigger>
                                        <Trigger Property="ItemsControl.HasItems"
                                                 Value="False">
                                            <Setter TargetName="Expander"
                                                    Property="UIElement.Visibility"
                                                    Value="Hidden" />
                                        </Trigger>
                                        <Trigger Property="TreeViewItem.IsSelected"
                                                 Value="True">
                                            <Setter TargetName="Bd"
                                                    Property="Panel.Background"
                                                    Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                                            <Setter Property="TextElement.Foreground"
                                                    Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" />
                                        </Trigger>
                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="TreeViewItem.IsSelected"
                                                           Value="True" />
                                                <Condition Property="Selector.IsSelectionActive"
                                                           Value="False" />
                                            </MultiTrigger.Conditions>
                                            <Setter TargetName="Bd"
                                                    Property="Panel.Background"
                                                    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
                                            <Setter Property="TextElement.Foreground"
                                                    Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
                                        </MultiTrigger>
                                        <Trigger Property="UIElement.IsEnabled"
                                                 Value="False">
                                            <Setter Property="TextElement.Foreground"
                                                    Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </TreeView.Resources>

    Mais si quelqu'un a mieux, je suis preneur. J'avais cherché sans succès à l'époque.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/12/2014, 22h13
  2. Réponses: 9
    Dernier message: 24/02/2012, 14h39
  3. créer une table avec des colonnes de types différents
    Par d_hazem dans le forum Composants
    Réponses: 1
    Dernier message: 15/01/2009, 15h23
  4. Jointure entre 2 tables avec des champs de types différents
    Par qltmi dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/11/2008, 20h58
  5. listbox avec des items de couleur différente
    Par ifrit 23 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 08/02/2008, 22h28

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