[WPF - MVVM] TreeView (Encore?)

Résolu
CH4BRN
Messages postés
51
Date d'inscription
lundi 19 février 2018
Statut
Membre
Dernière intervention
6 février 2021
- 29 mars 2018 à 17:17
Whismeril
Messages postés
17335
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
19 mai 2022
- 30 mars 2018 à 12:37
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

Whismeril
Messages postés
17335
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
19 mai 2022
596
29 mars 2018 à 21:13
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
0
CH4BRN
Messages postés
51
Date d'inscription
lundi 19 février 2018
Statut
Membre
Dernière intervention
6 février 2021

Modifié le 30 mars 2018 à 11:59
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 ;)
0
Whismeril
Messages postés
17335
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
19 mai 2022
596
Modifié le 30 mars 2018 à 12:39
De rien ça fait 2 fois que tu trouves tout seul sans que mes interventions te soit utile ;)
0