[WPF - MVVM] TreeView (Encore?) [Résolu]

Signaler
Messages postés
51
Date d'inscription
lundi 19 février 2018
Statut
Membre
Dernière intervention
6 février 2021
-
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
-
Bien le bonsoir !

Je suis toujours à la recherche du saint TreeView qui s'affiche comme je le voudrais,
et dans cette quête, j'aurais (encore) besoin de votre aide, Ô codeurs chevronnés.

J'ai donc un TreeView ...
        <StackPanel Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="4" Grid.RowSpan="6">
            <TreeView Background="#394448"
                      DisplayMemberPath="{Binding ReceivedLog, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                      ItemsSource="{Binding Items}" Margin="5" MinHeight="700">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                        <Grid>

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>

                            <TextBlock FontWeight="Bold" Foreground="#00b5e2" Grid.Column="0" Text="{Binding Name}" />
                            <TextBlock Grid.Column="1" Text="    " />

                        </Grid>

                    </HierarchicalDataTemplate>

                </TreeView.ItemTemplate>

            </TreeView>


... que j'arrive à remplir sans trop de problèmes (j'en ai eu, mais ils sont loin maintenant, ils datent au moins de ce matin).
Mon soucis, mon nouveau soucis, c'est que je voudrais que cete TreeView soit "dépliée" jusqu'à une valeur bien précise.
Je m'explique :
Sur une vue, j'ai une DataGrid peuplée à partir d'une ObservableCollection. Quand je sélectionne une ligne de cette DataGrid, une nouvelle vue s'ouvre avec une TreeView présentant cette ObservableCollection sous forme d’arborescence.
L'idée, c'est que je voudrais que ma TreeView soit "ouverte" ou "dépliée" jusqu'à la valeur sélectionnée précédemment dans la DataGrid.

Je pensais utiliser quelque chose comme ExpandAll, ou SelectedItem, ou encore SelectedValue, mais apparement, ça n'existe pas/plus. la petite joyeuserie, c'est que je dois respecter absolument un modele MVVM.

Est ce que quelqu'un aurait la patience de m'orienter ou de m'aider?

J'ai l'impression de passer mes journées ici en ce moment.. C'est plutôt sympa !

1 réponse

Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Bonsoir, ce n’est pas un contrôle que j’utilise beaucoup.
Peut être avec SelectedValuePath
https://msdn.microsoft.com/fr-fr/library/system.windows.controls.treeview.selectedvaluepath(v=vs.110).aspx
Messages postés
51
Date d'inscription
lundi 19 février 2018
Statut
Membre
Dernière intervention
6 février 2021

Finalement, j'ai trouvé :
Dans ma classe de "noeud" personnalisée, j'ai ajouté un booleen :
 /// <summary>
        /// is the node expanded?
        /// </summary>
        private bool _isExpanded;

    /// <summary>
        /// gets or sets the node's expansion 
        /// </summary>
        public bool IsExpanded
        {
            get => _isExpanded;
            set => _isExpanded = value;
        }


Dans ma méthode "getChild" qui peuple le TreeView, j'ai ajouté quelque chose pour que tant que la valeur recherchée n'a pas été trouvée, on met "IsExpanded" a true :

       private List<TreeLog> GetChild(List<Log> logs, DateTime key)
        {
            bool expandable = true;
[... code ...]

  if ( treeLog.Name == test)
                {
                    Console.WriteLine("Corresponding");
                    expandable = false;
                }
                else
                {
                    Console.WriteLine("Not corresponding");
                }
                if ( expandable)
                {
                    treeLog.IsExpanded = true;
                }



enfin j'ai ajouté ceci à mon treeView :

<TreeView.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                            <Setter Property="IsExpanded" Value="{Binding IsExpanded}"/>
                        </Style>
                    </TreeView.ItemContainerStyle>


Du coup, le treeview se construit en depliant automatiquement les noeuds, jusqu'à ce que la valeur recherchée soit trouvée. A ce moment, "expandable" passe a false, et les noeuds suivants ne sont plus dépliés.

Voila, j'espère que ça aura aidé quelqu'un !

merci Whismeril ;)
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
De rien ça fait 2 fois que tu trouves tout seul sans que mes interventions te soit utile ;)