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 :

Listbox.SelectedValue sur Nothing et pourtant..


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut Listbox.SelectedValue sur Nothing et pourtant..
    Bonjour,
    j'ai une listbox bindée à une CollectionView. Lors de l'évènement Loaded, j'ai inscrit :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    lstMembres.SelectedValue = Nothing
    Malgré cela, au lancement de l'application, le premier membre de la liste est sélectionné et les détails s'affichent donc dans le panel d'à côté. Ce qui est curieux, c'est que la première fois que j'ai inscrit cette ligne de code, au 1er lancement, cela a marché : aucun membre n'était sélectionné. Depuis, et sans avoir rien changé d'autre, cela ne marche plus !
    Autre chose curieuse : pour tester, j'affiche la valeur de lstMembres.SelectedValue dans un label, et elle vaut bien Nothing !
    Le premier membre de la liste s'affiche avec un arrière-plan grisé (et non pas bleu comme lors d'une sélection souris). Qu'est-ce que cela signifie ?

  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 : 44
    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
    Utilise plutôt SelectedIndex = -1

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    J'ai lu ailleurs que :
    en cas de liaison (Binding) à une source de donnée la propriété ValueMember
    fait appel à SelectedValue (gestion de l'évenement SelectedValueChanged) et
    en aucun cas à SelectedIndex.
    par contre, la méthode de remplissage manuelle ..Add(obj) se refère à
    SelectedIndex.
    De toute façon, j'ai déjà essayé SelectedIndex = -1 et ça ne marche pas non plus...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    Voici mon code :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WPanelMembres.IsEnabled = False
     
    If Me.LocalView.Count > 0 Then
                lstMembres.SelectedValue = Nothing
    End If
     
    If lstMembres.SelectedValue Is Nothing Then
                lblTest1.Content = "NOTHING"
    Else
                WPanelMembres.IsEnabled = True
    End If
     
    lblTest2.Content = lstMembres.SelectedIndex.ToString
    Les labels Test1 et Test2 contiennent bien respectivement NOTHING et -1 et pourtant, WPanelMembres est bien Enabled au démarrage...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    En plaçant des break points, je viens de remarquer une chose curieuse : l'évènement SelectionChanged de ma Listbox est appelé de suite après l'évènement Loaded de ma fenêtre...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    J'ai également essayé :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    lstMembres.UnselectAll()
    sans plus de résultat...
    Ce qui, à mon avis foire, c'est que, comme je l'ai indiqué dans le précédent post, la procédure SelectionChanged de la listbox est appelée de suite après le Loaded de ma fenêtre, mais pourquoi ?
    Pour info, voici comment est effectué le binding :
    dans le xaml, j'ai défini une collectionViewSource :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    <CollectionViewSource x:Key="MembreSource" />
    qui est remplie dans le code behind :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MembreSource = CType(Me.FindResource("MembreSource"), CollectionViewSource)
    MembreSource.Source = db.Membres.ToList()
    Me.LocalView = CType(MembreSource.View, ListCollectionView)
    La listbox est contenue dans un DockPanel dont le DataContext est défini sur MembreSource.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    Bon, après un dernier test, il apparaît que c'est bel et bien l'appel à la procédure SelectionChanged de la listbox qui provoque tout.
    J'ai rajouté dans ma fenêtre un bouton qui permet de tout désélectionner avec ce code :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub btnDeselectAll_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnDeselectAll.Click
    Me.lstMembres.UnselectAll()
    End Sub
    Le clic sur le bouton désélectionne bien tous les éléments et mon WPanelMembres est bien désactivé !
    Alors qu'est-ce qui peut bien provoquer l'appel à SelectionChanged, juste après le Loaded de ma fenêtre ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Par défaut
    Je viens de trouver la solution ICI.
    Effectivement, c'est le remplissage de MembreSource dans le code behind qui provoque l'appel à SelectionChanged, ou plutôt, voici ce qui se passe :
    une View, lors de sa création, est positionnée par défaut sur le premier élément de la collection. Lors de l'affectation des données, la vue est crée ; le binding avec la listbox étant en mode TwoWay, le positionnement de la View sur le 1er élément provoque la mise à jour de la listbox en conséquence => d'où l'appel à SelectionChanged et la sélection du 1er élément de la listbox.
    Il faut donc ne positionner la View sur aucun élément grâce à :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.LocalView.MoveCurrentToPosition(-1)
    pour régler le problème ! OUF !

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

Discussions similaires

  1. ListBox inaccessible sur Feuille Excel
    Par soffya dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/09/2020, 16h04
  2. Listbox.selectedvalue et multivaleurs
    Par Tauros_king dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/02/2007, 08h54
  3. [VB.NET]probleme avec listbox.selectedvalue
    Par elastoplas dans le forum ASP.NET
    Réponses: 9
    Dernier message: 07/11/2006, 14h13
  4. Réponses: 3
    Dernier message: 05/07/2006, 17h29
  5. Réponses: 8
    Dernier message: 15/05/2006, 14h33

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