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 :

Problème définition d'un Binding


Sujet :

Windows Presentation Foundation

  1. #61
    Membre actif
    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
    Points : 265
    Points
    265
    Par défaut
    Hé oui, Thomas, 4 pages et toujours pas résolu. Regarde le projet en pièce jointe et tu verras pourquoi...

  2. #62
    Membre actif
    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
    Points : 265
    Points
    265
    Par défaut Origine du problème confirmée
    Bon, après un nouveau test, il semblerait que l'origine du problème soit bien ce que j'ai indiqué, à savoir un défaut de synchronisation, mais pas avec le moteur de binding !
    Voici la procédure de test :
    J'ai rajouté 2 propriétés à la classe Ville : une pour récupérer la CollectionView correspondant au Code Postal du lstMembres.SelectedItem et l'autre le membre à qui appartient cet objet Ville :
    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
     
    Private m_Col As ListCollectionView
    Private m_Membre As Membre
     
    Public Property MembreSource() As Membre
            Get
                Return m_Membre
            End Get
            Set(ByVal value As Membre)
                m_Membre = value
            End Set
    End Property
     
    Public Property VilleCol() As ListCollectionView
            Get
                Return m_Col
            End Get
            Set(ByVal value As ListCollectionView)
                m_Col = value
            End Set
    End Property
    J'ai modifié la propriété ID de cette même classe ainsi :
    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
    Public Property ID() As String
      Get
          Return m_ID
      End Get
      Set(ByVal value As String)
          m_ID = value
          If value = Nothing Then
              Dim strTest As String = String.Empty
              strTest &= "Propriété Ville.ID du membre " & Me.MembreSource.Nom & "définie à Nothing ! "
              strTest &= "CollectionView = {"
              For Each v As Ville In Me.VilleCol
                  strTest &= v.Nom & ", "
              Next
              strTest &= "}"
              MsgBox(strTest)
          End If
          OnPropertyChanged("ID")
      End Set
    End Property
    La msgbox apparaîtra donc dès que l'ID de la ville sera défini sur Nothing, en affichant le contenu de la CollectionView à cet instant précis.

    Dans la classe Membre, j'ai modifié le constructeur ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Sub New(ByVal name As String)
            Me.Nom = name
            m_Ville = New Ville
            Me.Ville.MembreSource = Me
            m_Statut = New StatutMembre
        End Sub
    Dans le code de Window1, j'ai modifié le txtCodePostal.TextChanged :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                If MyViewVille.Count > 0 Then
                    cboVille.ItemsSource = MyViewVille
                    CType(lstMembres.SelectedItem, Membre).Ville.VilleCol = MyViewVille
                    cboVille.IsEnabled = True
                    cboVille.IsDropDownOpen = False
                    cboVille.Focus()
    
                Else
                    txtCodePostal.Text = "01000"
                End If
    pour affecter la CollectionView.
    Enfin, dans le lstMembres.SelectionChanged, j'ai rajouté en 1ère instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CType(lstMembres.SelectedItem, Membre).Ville.VilleCol = MyViewVille
    En passant d'un membre à un autre (tous 2 ayant une ville définie), la msgbox apparait : le Ville.ID du membre que l'on vient de quitter est mis à Nothing (c'est toujours le SelectedItem de la listbox à ce moment-là) parce que la CollectionView a déjà changé (c'est celle du membre que l'on vient de sélectionner) => d'où la perte de l'ID de la ville.
    Autrement dit, quand on clique sur un autre membre, le SelectedItem de la Listbox n'a pas encore changé alors que la CollectionView, si. D'où un "décalage"...
    Autrement dit encore, le txtCodePostal.TextChanged est appelé AVANT le lstMembres.SelectionChanged. Il faudrait que ça soit l'inverse...
    La SelectedValue de la combo étant définie sur Ville.ID, normal que quand on re-sélectionne le membre, l'ID valant Nothing, rien n'est sélectionné ! CQFD.
    Reste à résoudre ce problème de synchro...

  3. #63
    Membre actif
    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
    Points : 265
    Points
    265
    Par défaut
    Bon, après tant de messages et de jours passés sur ce problème, je sature légèrement... Sur les quasi 500 visionnages de cette discussion, je ne sais trop combien de personnes se sont penchées sur le problème, mais il a l'air insoluble ou, en tout cas extrêmement complexe ! Peut-être pourrait-il faire l'objet d'un concours/défi ? A ce propos, vous trouverez ici le cahier des charges du problème - à la base, cela paraît très simple et tout bête, mais... - si ça en intéresse certains de relever le défi...
    Dernière chose : grâce au site de Bea Stollnitz, j'ai compilé les messages de debugging du moteur de binding dans un fichier ci-joint. Je n'arrive pas malgré tout à trouver la cause et surtout la solution du problème.
    Merci en tous cas à tous les contributeurs. Merci spécial à tomlev. Pour l'instant, je laisse en suspens, j'y reviendrai plus tard...
    Fichiers attachés Fichiers attachés

  4. #64
    Membre actif
    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
    Points : 265
    Points
    265
    Par défaut EUREKA !
    AAAAHHHHHH !!!!!!!! Problème enfin résolu DEFINITIVEMENT !!!

    Bon, pour faire bref :
    à chaque fois que je basculais d'un membre à un autre (les 2 ayant une ville définie), je m'apercevais qu'à un moment, le Ville.ID du membre que je venais de quitter était défini sur Nothing (pourquoi, ça , j'ai toujours pas compris...)
    Dans la classe Ville, j'ai tout simplement modifié la propriété ID comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Property ID() As String
            Get
                Return m_ID
            End Get
            Set(ByVal value As String)
                If value IsNot Nothing Then
                    m_ID = value
                    OnPropertyChanged("ID")
                End If
            End Set
    End Property
    De façon à ne mettre à jour cette propriété que si elle ne vaut pas Nothing.
    De même, j'ai modifié la propriété Ville de la classe Membre ainsi :
    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
     
    Public Property Ville() As Ville
            Get
                Return m_Ville
            End Get
            Set(ByVal value As Ville)
                If value IsNot Nothing Then
                    If value.ID IsNot Nothing Then
                        m_Ville.ID = value.ID
                    End If
     
                    If value.Nom IsNot Nothing Then
                        m_Ville.Nom = value.Nom
                    End If
     
                    If value.CodePostal IsNot Nothing Then
                        m_Ville.CodePostal = value.CodePostal
                    End If
     
                    If value.ID IsNot Nothing AndAlso value.Nom IsNot Nothing AndAlso value.CodePostal IsNot Nothing Then
                        OnPropertyChanged("Ville")
                    End If
                End If
            End Set
    End Property
    Je me suis également aperçu que lors d'un SelectionChanged de la listbox, le binding effectuait une sorte de boucle plusieurs fois : un Get au niveau de la Source, suivi d'un Set, puis d'un Get, etc...

    Je me suis donc posé les questions :
    • Quand la Target doit-elle être mise à jour ? => A un seul moment : uniquement lorsqu'un SelectionChanged de la listbox intervient
    • Quand la Source doit-elle être mise à jour ? => A un seul moment : uniquement lorsqu'un SelectionChanged de la combobox Ville intervient

    J'ai donc modifié le binding de : SelectedItem et SelectedValue (combobox Ville) ; Text (txtCodePostal) en définissant pour les 3, l'UpdateSourceTrigger = Explicit.
    Puis, pour ces 3 propriétés, je mets à jour le binding :
    • Update de la Source uniquement sur le cboVille.SelectionChanged
    • Update de la Target uniquement sur le lstMembres.SelectionChanged

    Et voilà : je peux passer d'un membre à un autre sans fin, la ville sélectionnée est toujours la bonne, plus d'info perdue !
    OUF , OUF et OUF !!!!!! Bien content de pouvoir enfin mettre le tag Résolu sur ce !,*?!*! de problème
    Merci encore à tous.

+ Répondre à la discussion
Cette discussion est résolue.
Page 4 sur 4 PremièrePremière 1234

Discussions similaires

  1. Problème définition nouveau projet GTK
    Par Clopinet85 dans le forum GTK+ avec C & C++
    Réponses: 16
    Dernier message: 06/05/2013, 18h26
  2. [WPF]Problème d'update de binding
    Par guitoux1 dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 12/06/2007, 18h42
  3. problème de récursivité avec .bind
    Par polo42 dans le forum Tkinter
    Réponses: 2
    Dernier message: 30/04/2007, 19h52
  4. Problème définition constructeur
    Par bugland dans le forum Langage
    Réponses: 11
    Dernier message: 12/02/2007, 15h34
  5. problème définition alias
    Par julien.63 dans le forum Apache
    Réponses: 2
    Dernier message: 26/10/2006, 18h41

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