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 :

Pré-sélection d'item d'une combobox


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Par défaut Pré-sélection d'item d'une combobox
    Bonjour,

    J'ai une combobox que j'ouvre par le code (IsDropDownOpen = true) et je souhaiterais que le premier élément soit pré-sélectionné.

    Voici ce que j'entend par pré-sélectionné : Le premier élement à le focus, il est donc en état "Highlight" mais il n'est pas sélectionné. La combo n'a pas encore d'élément sélectionné.

    Après différents effets, je n'ai toujours pas trouvé de bons résultats.


    Ce que je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    comboBox.IsDropDownOpen = true;
    comboBox.SelectedIndex = 0;
    comboBox.Focus();
    Cela fonctionnait au seul détail que l'élément était sélectionné donc la propriété SelectedItem changait. Je ne dois pas avoir ce comportement. Je dois refaire exactement la même chose mais sans que l'item soit sélectionné.


    J'ai pensé a donner le focus au premier élément mais mes Items sont des objet métiers et je ne sais pas comment obtenir l'item "visuel".


    Merci d'avance pour votre aide

  2. #2
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Salut,

    Peut être une piste (pas la plus propre mais ... ).

    Vu que tu as accès au code-behind, tu peux t'abonner à l'évènement de fermeture de la combobox (le ContextMenu contenant tes items)

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cb.DropDownClosed += cb_DropDownClosed;
     
    void cb_DropDownClosed(object sender, EventArgs e)
    {
    	BindingExpression expression = cb.GetBindingExpression(ComboBox.SelectedIndexProperty);
    	if (expression != null)
    	{
    		expression.UpdateSource();
    	}
    }

    En gros, ça rafraichit au niveau binding le SelectedIndex uniquement quand tu fermes le le ContextMenu.

    En binding, tu spécifies que la mise à jour n'est pas en auto :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    SelectedIndex="{Binding Index, UpdateSourceTrigger=Explicit}"

    Et normalement, ça doit te rapprocher du fonctionnement voulu...

    Bon courage !!

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Bonjour,

    Je ne pense pas que tu arriveras à faire ce que tu veux sans refaire un contrôle ComboBox (tu peux en hériter). La raison à celà est que la selection de l'item courant et donc son Focus est géré directement dans le code du contrôle ComboBox. C'est son comportement standard.

    Ensuite pour répondre à ta question concernant l'accès à l'élément graphique généré par la combobox autour de tes objets métiers (un comboboxitem donc) tu peux le faire via le contrôle ItemContainerGenerator accessible dans le contrôle ComboBox.

    Exemple :

    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
     
      public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
     
                var list = new[]
                    {
                        new Employee {Name = "Dupont"},
                        new Employee {Name = "Smith"},
                        new Employee {Name = "Li"}
                    };
     
                cb.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
                cb.ItemContainerGenerator.ItemsChanged += ItemContainerGenerator_ItemsChanged;
     
                cb.ItemsSource = list;
                cb.DisplayMemberPath = "Name";
            }
     
            private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
            {
                var generator = (ItemContainerGenerator)sender;
     
                if (generator.Status == GeneratorStatus.ContainersGenerated)
                {
                    var container = generator.ContainerFromItem(cb.Items[0]) as ComboBoxItem;
                    Debug.Assert(container != null, "container != null");
                    container.Focus();
                }
            }
     
            private void ItemContainerGenerator_ItemsChanged(object sender, ItemsChangedEventArgs e)
            {
                var generator = (ItemContainerGenerator)sender;
     
                if (e.Action == NotifyCollectionChangedAction.Reset)
                {
                    foreach (var item in cb.Items)
                    {
                        var container = generator.ContainerFromItem(item);
                    }
     
                }
                else if (e.Action == NotifyCollectionChangedAction.Add)
                {
                    var container = generator.ContainerFromIndex(e.Position.Index);
                }
            }
    Attention cependant à l'évènement ItemsChanged. Ce n'est pas parce qu'il est levé que les objets graphiques ont été générés.

    J'avais écrit un petit article à l'époque qui montre en Silverlight comment le gérer de manière plus clean.
    http://blog.john-thiriet.com/2010/08...nitemschanged/

    Enfin dans tout les cas dans ton cas spécifique il va te falloir hériter de ComboBox à mon avis, pour changer la logique de sélection.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Par défaut
    Merci pour tous ça :-)

    Pour l'instant le problème est abandonné, après avoir passé plus d'une journée sur le problème, mon boss me dis qu'il ne veut finalement plus ce comportement... (désormais on ne pré-sélectionne plus le premier élément).

    Mais bon, je garde vos solutions sous le coude s'il change d'avis

    Dans tous les cas, merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/08/2009, 12h14
  2. Selectionner un item d'une combobox
    Par joKED dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/11/2007, 15h35
  3. comment blquer la liste des items d une combobox
    Par ryoussef19 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 01/08/2007, 11h27
  4. Création d'items dans une comboBox
    Par Nicolas2074 dans le forum Sharpdevelop
    Réponses: 3
    Dernier message: 26/04/2007, 09h49
  5. [VB.NET2005]PropertyGrid : utiliser un item d'une combobox
    Par NicolasJolet dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/03/2006, 15h51

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