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 :

[ItemsControl] Sélectionner un item au démarrage


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 [ItemsControl] Sélectionner un item au démarrage
    Bonjour,

    J'ai créé un custom control qui hérite de ItemsControl et dont les données proviennent d'un fichier XML via un XmlDataProvider. Les items sont donc de type XmlNode et les éléments graphiques de type TreeViewItem.

    Je voudrais sélectionner un item au moment de l'affichage de mon control. Comme les conteneurs graphiques de chaque item ne sont pas tous construit, j'utilise le ItemContainerGenerator:
    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
    public MyItemsControl()
    {
        if (this.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
        {   
             EventHandler onStatusChanged = null;
    
             onStatusChanged = new EventHandler(delegate
             {
                  if (this.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
                  {
                       if (this.Items.Count > 0)
                       {      
                            this.ExpandAndSelectItem(this, this.ItemToSelect);
    
                            this.ItemContainerGenerator.StatusChanged -= onStatusChanged;
                       }
                  }         
    
                  this.ItemContainerGenerator.StatusChanged += onStatusChanged;
             });
        }
    }
    La méthode ExpandAndSelectItem parcours les enfants et utilise également ItemContainerGenerator:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    public bool ExpandAndSelectItem(ItemsControl pParentContainer, XmlNode pItemToSelect)
    {
          foreach (object item in pParentContainer.Items)
          {
               TreeViewItem currentContainer = pParentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
     
                XmlNode node1 = item as XmlNode;
                XmlNode node2 = pItemToSelect as XmlNode;
     
                if (      (node1 != null)
                     && (node2 != null)
                     && (XNode.DeepEquals(node1.GetXElement(), node2.GetXElement()))
                     && (currentContainer != null)
                   )
                {                    
                        currentContainer.IsSelected = true;
                        currentContainer.BringIntoView();
                        currentContainer.Focus();
     
                        // The item was found.
                        return true;
                }
           }
     
           foreach (Object item in pParentContainer.Items)
           {
               TreeViewItem currentContainer = pParentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
     
                // If children exist.
                if (currentContainer != null && currentContainer.Items.Count > 0)
                {
                    // Keeps track of if the TreeViewItem was expanded or not.
                    bool wasExpanded = currentContainer.IsExpanded;
     
                    // Expands the current TreeViewItem so we can check its child TreeViewItems.
                    currentContainer.IsExpanded = true;
     
                    // If the TreeViewItem child containers have not been generated, we must listen to the StatusChanged event until they are.
                    if (currentContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                    {
                        // Stores the event handler in a variable so we can remove it (in the handler itself).
                        EventHandler onStatusChanged = null;
     
                        onStatusChanged = new EventHandler(delegate
                        {
                            if (currentContainer.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
                            {
                                if (ExpandAndSelectItem(currentContainer, pItemToSelect) == false)
                                {
                                    // The assumption is that code executing in this EventHandler is the result of the parent not
                                    // being expanded since the containers were not generated.
                                    // Since the itemToSelect was not found in the children, collapse the parent since it was previously collapsed.
                                    currentContainer.IsExpanded = false;
                                 }
     
                                  // Removes the StatusChanged event handler since we just handled it (we only needed it once).
                                    currentContainer.ItemContainerGenerator.StatusChanged -= onStatusChanged;
                           }
                      });
     
                      currentContainer.ItemContainerGenerator.StatusChanged += onStatusChanged;
                  }
                  // Otherwise the containers have been generated, so look for item to select in the children.
                  else
                  {
                       if (ExpandAndSelectItem(currentContainer, pItemToSelect) == false)
                       {
                            // Restores the current TreeViewItem's expanded state.
                            currentContainer.IsExpanded = wasExpanded;
                       }
                       // Otherwise the node was found and selected, so return true.
                       else
                       {
                            return true;
                       }
                  }
              }
         }
     
          return false;
    }
    L'item est bien trouvé, le IsSelected est bien mis à true mais l'item n'est pas sélectionné

    Est-ce que je modifie les éléments graphiques trop tôt dans la construction du control ? Je n'arrive pas à comprendre pourquoi mon item n'apparait pas comme sélectionné

  2. #2
    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
    Si je fait hériter ma classe de TreeView au lieu de ItemsControl, l'item est bien sélectionné
    Pourtant, j'ai définit la classe TreeViewItem comme container pour mon ItemsControl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new TreeViewItem();
    }
     
    protected override bool IsItemItsOwnContainerOverride(object pItem)
    {
        return pItem is TreeViewItem;
    }
    Je ne suis pas sensé avoir le template par défaut, et donc, le HighlightBrushKey comme Background lorsque l'élément est sélectionné ?

Discussions similaires

  1. sélectionner un item dans un listview en mode détail.
    Par grome dans le forum Windows Forms
    Réponses: 7
    Dernier message: 22/08/2007, 13h16
  2. [C#] Comment sélectionner un item de listview selon des critères
    Par beufreecasse dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/10/2006, 21h34
  3. [VB.NET]Impossible de sélectionner un item de listview
    Par SergeF dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/08/2006, 13h07
  4. Sélectionner un item d'une list view
    Par Coussati dans le forum Composants VCL
    Réponses: 4
    Dernier message: 14/02/2006, 23h16
  5. Sélectionner les items 5 par 5
    Par Coussati dans le forum Langage
    Réponses: 13
    Dernier message: 26/10/2005, 09h12

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