[WPF - MVVM] TreeView (Encore?)

Résolu
CH4BRN Messages postés 49 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 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 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 !
A voir également:

1 réponse

Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
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 49 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 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
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
Rejoignez-nous