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] HierarchicalDataTemplate et Binding


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Par défaut [TreeView] HierarchicalDataTemplate et Binding
    Bonjour,

    J'ai une fenêtre qui contient un TreeView où sont définis plusieurs HierarchicalDataTemplate.
    J'aimerais activer/désactiver un bouton situé dans la fenêtre (mais à l'extérieur du TreeView) selon le DataType du HierarchicalDataTemplate de l'élément sélectionné.
    J'ai regardé du côté de SelectedItem mais je n'arrive pas à récupérer le DataType

    AL2000

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu travailles en MVVM ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Par défaut
    Oui. Chaque HierarchicalDataTemplate correspond à un ViewModel.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    OK, donc le plus simple c'est de binder le IsEnabled du bouton à une propriété du ViewModel de la vue qui contient le bouton et le TreeView (ou de passer par le CanExecute de la commande du bouton). Tu peux ensuite changer cette propriété en fonction de l'élément sélectionné du TreeView.

    La difficulté, justement, est de savoir quel est l'élément sélectionné dans le TreeView, car la propriété SelectedItem est en lecture seule et n'est donc pas bindable... La technique que j'utilise repose sur une propriété attachée, disponible dans la librairie Dvp.NET. Il faut :

    - que le ViewModel de la vue qui contient le TreeView ait une propriété (SelectedItem) qui contiendra l'élément sélectionné
    - binder la propriété attachée TreeViewBehavior.SelectedItem sur cette propriété
    - que le ViewModel de chaque item du TreeView ait une propriété (par exemple IsSelected) qui indique que l'élément est sélectionner
    - binder le IsSelected du TreeViewItem sur cette propriété

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <TreeView ItemsSource="{Binding Items}"
              dvp:TreeViewBehavior.SelectedItem="{Binding SelectedItem}"
              dvp:TreeViewBehavior.IsSelectedPath="IsSelected"
              dvp:TreeViewBehavior.TrackSelectedItem="True">
     
        <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <Setter Property="IsSelected" Value="{Binding IsSelected}" />
            </Style>
        </TreeView.ItemContainerStyle>
     
    </TreeView>

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Par défaut
    En fait, j'aimerais éviter de faire du code behind pour modifier le IsEnabled du bouton selon le type de l'élément sélectionné.
    Je pensais utiliser les triggers de HierarchicalDataTemplate:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <HierarchicalDataTemplate.Triggers>
        <Trigger Property="{Binding Path=IsSelected, RelativeSource=RelativeSource AncestorType={x:Type BaseViewModel}}}" Value="True"   >
            <Setter TargetName="MyButton"   Property="IsEnabled"  Value="True" />
        </Trigger>
    </HierarchicalDataTemplate.Triggers>

    Malheureusement, à ce niveau, le bouton (ou tout autre élément extérieur au TreeView) n'est pas visible

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par al2000 Voir le message
    En fait, j'aimerais éviter de faire du code behind pour modifier le IsEnabled du bouton selon le type de l'élément sélectionné.
    Qui a parlé de code-behind ? C'est juste une propriété du ViewModel, que tu mets à jour en fonction de l'élément sélectionné...


    Code : 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
    class TotoViewModel
    {
        private bool _buttonEnabled;
        public bool ButtonEnabled
        {
            get { return _buttonEnabled; }
            set
            {
                _buttonEnabled = value;
                OnPropertyChanged("ButtonEnabled");
            }
        }
     
        private object _selectedItem;
        public object SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                OnPropertyChanged("SelectedItem");
                ButtonEnabled = /* test sur l'item sélectionné ... */;
            }
        }
    }
    Citation Envoyé par al2000 Voir le message
    Je pensais utiliser les triggers de HierarchicalDataTemplate:
    Tu peux pas, puisque le bouton que tu veux désactiver ne fait pas partie du template...

Discussions similaires

  1. Treeview/HierarchicalDataTemplate : IsMouseOver
    Par koyot3 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 23/01/2012, 16h19
  2. TreeView + HierarchicalDataTemplate
    Par jacquesprogram dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 24/08/2011, 15h54
  3. TreeView, HierarchicalDataTemplate et Binding depuis un DataSet
    Par dtcSearch dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 06/05/2010, 09h57
  4. TreeView + HierarchicalDataTemplate + RoutedEvent
    Par s3phi dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 03/12/2009, 09h52
  5. TreeView / HierarchicalDataTemplate / TreeViewItem : comment faire ?
    Par seiryujay dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 23/04/2009, 09h41

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