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. #41
    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
    Désolé tomlev, mais ça ne marche pas !
    J'ai effectué les modifications que tu cites : suppression de SelectedValue et mode OneWay pour la textbox CodePostal.
    Avec ça :
    quand on sélectionne une ville pour un membre, tous les autres membres affichent la même ville et le même code postal. Pourtant, si on change la ville d'un autre membre, en lisant les propriétés de l'objet membre, on voit bien que la ville n'est pas la même ; seulement, à l'affichage tous les membres affichent la dernière ville sélectionnée...

  2. #42
    Membre habitué Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 183
    Points
    183
    Par défaut
    Si tu as toujours le IsSynchronizedWithCurrentItem à True ou null (sa valeur par défaut), essaies de le passer à false. Si ta source de données est une CollectionViewSource, ça change le comportement.

  3. #43
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Bizarre... effectivement le code postal dans la TextBox ne change pas quand on change le membre sélectionné, et je comprends pas trop pourquoi vu que le DataContext change...
    Au fait, dans ton code tu définis explicitement le texte de la TextBox (pour mettre une valeur par défaut de "01000"). Il ne faut pas faire ça, parce que ça supprime le binding... Cela dit, j'ai essayé de l'enlever, et ça règle pas le problème

  4. #44
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    OK, je crois que je comprends... en fait, en définissant le binding en OneWay, ça fait "sauter" le binding quand on tape quelque chose dedans. A partir de là, la TextBox ne se met plus à jour...
    Mais il n'est pas non plus correct de le mettre en TwoWay : ça n'a pas de sens de modifier le code postal d'une ville existante...

    En fait à mon avis cette TextBox devrait juste servir de champ de recherche. Tu pourrais afficher le code postal réel dans un TextBlock à côté du Combo, et utiliser la textBox juste pour chercher la ville

    D'autre part, quand le membre sélectionné change, il faudrait changer le filtre de la CollectionView, sinon la ville du membre ne peut pas s'afficher vu qu'elle n'est pas dans la vue

  5. #45
    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
    Mouais... c'est tout de même pas très clair que qui se passe...
    Encore une fois, le mode TwoWay de la textbox CodePostal a du sens : il ne s'agit pas de modifier le CP de la ville en question mais, s'il est modifié, de modifier la vue de la combo en conséquence.
    Afficher une textbox pour la recherche + un autre tetxblock pour l'affichage uniquement du CP, ça fait pas très clean et "pro"...
    En outre, la vue est la bonne à chaque fois. Voici ce que je fais :

    • Je sélectionne SHULZ et je tape ce CP "06500" ; je choisis "MENTON" comme ville.
    • Je parcours plusieurs fois la liste des membres, en revenant sur SHULZ, c'est à chaque fois nickel (lavue est la bonne ; MENTON sélectionnée).
    • Je sélectionne GENCY, je tape 06240 et choisis BEAUSOLEIL.
    • Je reviens sur SHULZ => tout est ok (tu vois que la vue a bien changé)
    • Je reviens sur GENCY => le CP est bon (06240) ; la combo n'affiche rien MAIS déroule-la et tu verras que pourtant la vue est bien la bonne (elle contient bien BEAUSOLEIL mais simplement, n'est pas sélectionnée...)
    • Je reviens sur SHULZ, idem => rien de sélectionné MAIS la vue est la bonne ; la combo contient la bonne liste.

    C'est juste l'item sélectionné qui ne semble pas se définir correctement.
    L'affichage du CP dans la textbox s'effectue toujours correctement ; donc se servir de ce textbox pour la recherche ET l'affichage ne pose pas de soucis.

    P.S : à côté de ma listbox, je me suis rajouté un textblock dans lequel j'affiche les propriétés de l'objet Membre sélectionné : regarde ce qui se passe

  6. #46
    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
    Je viens de tomber sur cet article. J'ai fait comme indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ComboBox DisplayMemberPath="Nom" SelectedValue="{Binding Path=Ville.ID}" SelectedValuePath="ID" IsSynchronizedWithCurrentItem="True"/>
    J'ai donc viré le SelectedItem. J'ai refait la manip précédente : cette fois la propriété ID de l'objet membre n'est jamais perdue, c'est la propriété Ville.Nom qui l'est ! (Pour un résultat toujours identique => rien de sélectionné)

  7. #47
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par jacquesprogram Voir le message
    Je viens de tomber sur cet article. J'ai fait comme indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ComboBox DisplayMemberPath="Nom" SelectedValue="{Binding Path=Ville.ID}" SelectedValuePath="ID" IsSynchronizedWithCurrentItem="True"/>
    J'ai donc viré le SelectedItem. J'ai refait la manip précédente : cette fois la propriété ID de l'objet membre n'est jamais perdue, c'est la propriété Ville.Nom qui l'est ! (Pour un résultat toujours identique => rien de sélectionné)
    Je ne comprends pas pourquoi tu t'obstines à gérer séparément le nom et l'ID... si tu manipules juste l'objet Ville comme un tout, ça règlera pas mal de problèmes

  8. #48
    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
    Euh... je comprends pas trop là ; il me semble que c'est ce que je fais : la propriété Ville de mon membre est un objet Ville.

  9. #49
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par jacquesprogram Voir le message
    la propriété Ville de mon membre est un objet Ville.
    Ben oui, alors pourquoi tu t'embêtes avec l'ID ? il suffit de binder le SelectedItem à l'objet Ville du membre

    Par contre avec ton truc actuel ça ne marchera pas, vu que tu instancies un objet Ville dans chaque Membre et que tu copies les propriétés dans le Set :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Public Property Ville() As Ville
            Get
                Return m_Ville
            End Get
            Set(ByVal value As Ville)
                m_Ville.ID = value.ID
                m_Ville.Nom = value.Nom
                m_Ville.CodePostal = value.CodePostal
                OnPropertyChanged("Ville")
            End Set
        End Property
    Alors qu'il faudrait simplement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Public Property Ville() As Ville
            Get
                Return m_Ville
            End Get
            Set(ByVal value As Ville)
                m_Ville = value
                OnPropertyChanged("Ville")
            End Set
        End Property
    Dans ce cas la ville du membre et celle de la liste des villes correspond bien à la même référence, et binding sur SelectedItem devrait marcher

  10. #50
    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
    OK, je vois. Donc en fait, l'objet ville qui est actuellement instancié à l'intérieur de la classe membre, il faudrait l'instancier depuis l'extérieur en renseignant ses propriétés selon ce qui rentré par l'utilisateur et envoyer cet objet à la propriété Ville du membre... OK.
    J'ai pas le temps de tester tout de suite, je m'y remets ce soir et verrai ce que ça donne.

  11. #51
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par jacquesprogram Voir le message
    il faudrait l'instancier depuis l'extérieur en renseignant ses propriétés selon ce qui rentré par l'utilisateur
    Non, il suffit de prendre la ville sélectionnée dans le ComboBox... pas besoin de renseigner les propriétés de la ville, elles sont déjà définies

  12. #52
    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
    OK. J'ai testé, ça ne marche pas plus. Je mets en pièce jointe un nouveau projet test : c'est le même que le premier, avec la propriété Statut en plus, qui fonctionne sur le même principe et marche très bien.

  13. #53
    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, apparemment, le problème se situerait plus sur la textbox CodePostal. Voici le dernier test que je viens de faire :
    j
    • j'ai passé la textbox CodePostal en Binding Mode=OneWay
    • j'ai modifié le constructeur de la classe Membre, comme ceci
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      Public Sub New(ByVal name As String, ByVal cp As String)
              Me.Nom = name
              m_Ville = New Ville
              Me.Ville.CodePostal = cp
              m_Statut = New StatutMembre
      End Sub
      (et modifié la création des objets membres en rajoutant un CP différent pour chacun, dans la classe MembresList).

    On peut définir la ville pour chaque membre, et passer de l'un à l'autre indéfiniment, la collectionView change, rien n'est jamais perdu. Donc, les SelectedItem, SelectedValue & SelectedValuePath de la combo ville sont bien paramétrés et ne sont pas à l'origine du problème. Apparemment, ce qui "dérègle" le binding c'est, comme tu l'as dit tomlev, le fait de taper quelquechose dans la textbox CodePostal.
    Comment résoudre le problème sans dissocier le champ de recherche de celui d'affichage du CP, ça j'en sais rien...

  14. #54
    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
    Grrr ! Bon, autre manipulation qui m'amène à penser que ce n'est pas le fait de taper un code postal qui dérègle tout finalement :
    j'ai tout remis comme au départ (txtCodePostal en binding Mode=TwoWay).
    Ensuite :
    • je définis la ville du 1er membre
    • je définis la ville du dernier membre (code postal différent du premier)

    Si je passe du dernier au premier membre EN PASSANT par un des autres membres où la ville n'a pas été définie, tout marche comme il faut.
    En passant du 1er au dernier (ou inversement) => tout se dérègle.

  15. #55
    Invité
    Invité(e)
    Par défaut
    Bref, cette discussion prendra bientôt le record de posts

  16. #56
    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
    J'ai peut-être compris le pourquoi du dérèglement :
    lorsque je sélectionne un membre dont la ville est définie, et que je passe sur un autre membre dont la ville est aussi définie, le moteur de binding va plus vite que le code chargé de recréer à chaque fois la CollectionView (puisque txtCodePostal vient de changer en changeant de membre) : au moment où il essaie de se binder, Ville.ID et Ville.Nom sont introuvables dans la CollectionView qui est toujours celle du membre précédent (n'ayant certainement pas eu encore le temps de changer, vu que c'est le code contenu dans le TextChanged qui est chargé de la créer) => d'où le dérèglement.
    Maintenant, comment régler le problème...?

  17. #57
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par jacquesprogram Voir le message
    Grrr ! Bon, autre manipulation qui m'amène à penser que ce n'est pas le fait de taper un code postal qui dérègle tout finalement
    Je suis à peu près sûr que si : avec des breakpoints dans les évènements Loaded et TextChanged, j'ai mis un espion sur txtCodePostal.GetBindingExpression(TextBox.TextProperty). Dans le Loaded, OK, on récupère bien une BindingExpression. Dans le TextChanged (donc juste après avoir tapé dans la TextBox), on récupère Nothing : la TextBox n'est plus bindée...

    Mais ce problème ne se pose qu'en mode OneWay

  18. #58
    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
    Ouais... Bon, j'ai rajouté un membre private à ma window :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private BindingCP As Binding
    Ensuite, dans le loaded, je sauvegarde le binding :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BindingCP = BindingOperations.GetBinding(txtCodePostal, TextBox.TextProperty)
    Que je restaure sur le TextChanged :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BindingOperations.SetBinding(txtCodePostal, TextBox.TextProperty, BindingCP)
    Résultat identique.
    Mais je reste perplexe : si le binding de la textbox "saute", pourquoi affiche-t-il toujours le bon CP (c'est donc que le binding avec membre.Ville.CodePostal fonctionne...) ? Dans les propriétés du membre, on voit bien que c'est la valeur Ville.ID qui est perdue, et ce, au 2nd changement entre un membre et un autre (pas au premier)...

  19. #59
    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
    tomlev, chez moi le binding reste toujours actif. J'ai pu le vérifier en affichant dans le textblock : BindingOperations.GetBindingExpression(txtCodePostal, TextBox.TextProperty).Status.ToString => Active quelque soit le membre sélectionné.

  20. #60
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    4 pages pour tenter de régler un problème de binding ?

    Il a quoi ton programme ? Il est hanté ou quoi ?

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

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, 17h26
  2. [WPF]Problème d'update de binding
    Par guitoux1 dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 12/06/2007, 17h42
  3. problème de récursivité avec .bind
    Par polo42 dans le forum Tkinter
    Réponses: 2
    Dernier message: 30/04/2007, 18h52
  4. Problème définition constructeur
    Par bugland dans le forum Langage
    Réponses: 11
    Dernier message: 12/02/2007, 14h34
  5. problème définition alias
    Par julien.63 dans le forum Apache
    Réponses: 2
    Dernier message: 26/10/2006, 17h41

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