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

CH4BRN 26 Messages postés lundi 19 février 2018Date d'inscription 19 avril 2018 Dernière intervention - 29 mars 2018 à 17:17 - Dernière réponse : Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention
- 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 !
Afficher la suite 

3 réponses

Répondre au sujet
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 29 mars 2018 à 21:13
0
Utile
2
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
CH4BRN 26 Messages postés lundi 19 février 2018Date d'inscription 19 avril 2018 Dernière intervention - 30 mars 2018 à 11:57
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 ;)
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 30 mars 2018 à 12:37
De rien ça fait 2 fois que tu trouves tout seul sans que mes interventions te soit utile ;)
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.