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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Problème définition d'un Binding
    Bonjour,
    Décidément, les Bindings me causent bien des soucis en ce moment...
    Voici le problème :
    J'ai une classe Membre avec 1 propriété Ville qui est elle-même un objet Ville comportant les 3 propriétés suivantes : ID, Nom, CodePostal. De sorte que pour accéder au nom de la ville d'un membre, je fais : MonMembre.Ville.Nom
    J'ai créé une Textbox CodePostal bindée à la propriété Ville.CodePostal de mon objet Membre. J'ai aussi créé une Combobox Ville et là, le binding me pose problème. Tant que la textbox CodePostal est vide, je veux que la Combobox soit désactivée (ça, c'est ok). Dès que la textbox CodePostal atteint 5 caractères, je veux que la combobox liste toutes les villes ayant ce code postal (c'est aussi ok, je l'ai bindé à une DataView qui contient la liste des villes). Le DataContext de la combo Ville se retrouve donc défini sur cette DataView, seulement, je veux que la propriété SelectedItem soit bindée à la propriété Ville.ID de mon objet Membre (donc un DataContext différent).
    Voici le code Xaml pour la textbox CodePostal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <TextBox Text="{Binding Mode=TwoWay, Path=Ville.CodePostal}" />
    Et pour la combobox Ville :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <ComboBox DisplayMemberPath="Nom" SelectedItem="{Binding Path=Ville.Nom}" SelectedValue="{Binding Path=Ville.ID}" SelectedValuePath="ID" />
    Avec ce code, ça marche, sauf que la propriété Ville de mon objet Membre n'est jamais renseignée, vu que le DataContext de la combo est la DataView qui contient la liste des villes ayant le même CodePostal... J'ai besoin de ce DataContext uniquement pour le ItemsSource (défini en code-behind), mais pas pour le SelectedItem. J'espère avoir été clair.
    Comment résoudre ce problème ?

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Enlève le SelectedItem="{Binding Path=Nom}"
    Ta combobox contient des Villes pas des String, donc le SelectedItem ne peut pas être une chaine... Le SelectedValue devrait suffire à gérer ça proprement

  3. #3
    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 enlevé le SelectedItem, mais toujours pareil. En outre, j'ai absolument besoin de cette propriété.
    Un exemple :
    Je tape dans la textbox CodePostal : "06500" => Immédiatement, la combobox Ville contient les 5 villes correspondantes, avec la première sélectionnée. Je choisis la ville du membre en question, qui est la 3e de la liste. Je sélectionne un autre membre, puis je reviens sur le membre modifié => dans la combobox Ville, la ville sélectionnée est la première !
    En fait, ce qui se passe, c'est que ma combobox Ville est bindée à la DataView créée à partir du Code Postal rentré mais elle devrait aussi être bindée à la propriété MonMembre.Ville. Le multibinding serait-il la solution au problème ? Si oui, comment le mettre en place ?

  4. #4
    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, je viens de me rendre compte que j'ai un message d'erreur du moteur de binding qui me signale que :
    BindingExpression Path Error : 'ID' Property not found on 'object' 'DataRowView' [...]
    Effectivement, la propriété ID n'existe pas, elle s'appelle VilleID, oops ! Mais bon, ça ne résout rien.
    Et puis, dans mes explications de tout à l'heure, je me suis légèrement trompé aussi. En fait, le DataContext de la cboVille, comme de tous les autres contrôles, est un objet Membre (sélectionné dans une listbox). C'est le ItemsSource de la combo Ville qui est défini sur la DataView.
    J'ai également modifié le SelectedItem de la cboVille comme ceci : SelectedItem="{Binding Path=Ville}".
    Ce qui me tue, c'est que j'ai dans la même window, une combobox Statut qui fonctionne parfaitement et est calquée sur le même modèle : à savoir la propriété Statut de mon objet Membre est un objet Statut. La seule différence avec la ville, c'est que l'ItemsSource est une ObservableCollection et non une DataView, et tout fonctionne très bien.
    Pourquoi dans le cas de ma combo Ville, ça foire ?

  5. #5
    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
    Un dessin valant mieux qu'un long discours, voici un diagramme peut-être plus explicatif...
    Voir le diagramme

  6. #6
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Ton SelectedValuePath, il faut mettre "VilleID" et non "ID"

  7. #7
    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
    Ca y est. Vous trouverez ci-joint le projet de test (c'est du VB).
    Lancez-le : observez le comportement étrange.
    Supprimez le IsSynchronizedWithCurrentItem de la combobox Ville et observez à nouveau l'étrange comportement.
    Voilà. Si quelqu'un a une explication/solution...

  8. #8
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Bon, comme je le disais, il fallait enlever le binding sur SelectedValue (et le SelectedValuePath ne sert donc à rien) parce que ça entre en conflit avec le binding sur SelectedItem. J'ai aussi mis en OneWay le binding de la TextBox sur le code postal : s'il est en TwoWay et qu'une ville est sélectionnée, ça change le code postal de la ville...

    Avec ces 2 modifs, ça marche bien

  9. #9
    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...

  10. #10
    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.

  11. #11
    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 : 43
    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 753
    Points
    39 753
    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

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

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