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 :

[Binding] Comment mettre à jour la source à la demande ?


Sujet :

Windows Presentation Foundation

  1. #1
    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 [Binding] Comment mettre à jour la source à la demande ?
    Salut,

    J'utilise un formulaire WPF pour modifier une entité EF. Actuellement, j'utilise un binding TwoWay, mais ça ne me convient pas vraiment : j'aimerais que la source ne soit pas mise à jour tout de suite, mais seulement quand je valide le formulaire. Vous allez me dire qu'il suffit d'utiliser un binding OneWay, et de mettre à jour la source par le code... Seulement, j'essaie de garder une architecture la plus générique possible (chaque entité a un formulaire associé via un attribut), et ça ne m'enchante pas trop de devoir écrire un code différent pour mettre à jour chaque entité...

    Existe-t-il une méthode pour provoquer la mise à jour la source du binding ? Dans les différents BindingMode, je ne vois rien qui correspond...

    J'ai vu la propriété UpdateSourceTrigger que je pourrais mettre à Explicit, mais je reviens à mon problème de départ : il faut que j'appelle UpdateSource sur chaque Binding (oui je sais, je suis paresseux )

    Quelqu'un aurait-il une solution magique ?

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Pour des cas comme cas, personnellement, je met le BindingMode à Explicit puis j'apelle UpdateSource (après avoir fait un GetBindingExpression): certes, faut le faire sur chaque Binding mais ca marche.

    Sinon, pour être plus générique:
    - tu fais une méthdode qui "scanne" chacun de tes contrôles
    - Pour chaque contrôle, tu récupères son BindingMode
    - Si BindingMode == Explicit, alors tu récupères la BindingExpression et tu fais un UpdateSource

  3. #3
    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
    Citation Envoyé par Thomas Lebrun Voir le message
    Sinon, pour être plus générique:
    - tu fais une méthdode qui "scanne" chacun de tes contrôles
    - Pour chaque contrôle, tu récupères son BindingMode
    - Si BindingMode == Explicit, alors tu récupères la BindingExpression et tu fais un UpdateSource
    Ouais, ça me semble pas mal comme solution
    Je teste ça ce soir et je te tiens au courant


  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    je lance une idee comme ca un peut tordu peut etre
    ca serait de mettre en place un multibinding avec le bouton de validation et un convertisseur qui passerait les informations

    maintenant je pense qu'il est vraiment necessaire de decoupler completement notament pour eviter le cas d'un changement d'information entre le moment ou tu change la valeur et le moment ou tu vas cliquer sur le bouton valider ...

    j'ai eu le meme soucis et j'ai creer un bindeur a verou en twoway
    je bind
    puis je verouille le bindeur
    quand je valider de deverouille

    l'autre solution c'est de binder sur une copie de la classe metier
    je reccup la copie (clone de ta classe metier)
    naturelement elle est binde sur mes control
    sur valider je fait une copie (CopyFrom sur la classe metier)

    mais bon ....

  5. #5
    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
    Effectivement la solution de travailler sur une copie me semblait pas mal, il aurait ensuite suffi d'appliquer les changements à l'ObjectContext via un ApplyPropertyChanges. Malheureusement je ne vois pas de moyen simple de réaliser la copie d'une entité EF... j'ai essayé de le faire par réflexion en me fiant aux attributs EDM, mais c'est un peu galère pour les associations "one to many" ou "many to many".

    Donc pour l'instant je vais m'en tenir à la solution proposée par Thomas, si j'arrive à m'en sortir... parcourir tous les contrôles est pas aussi simple en WPF qu'en Windows Forms

  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
    Bon ben en fait j'ai trouvé une solution beaucoup plus simple et plus propre
    Il suffit d'utiliser un BindingGroup :
    - j'assigne la propriété BindingGroup du conteneur de mon formulaire
    - les contrôles enfants du conteneur héritent de cette propriété
    - et comme par magie, la source n'est pas mise à jour tout de suite mais sur demande...

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ScrollViewer Name="scvEditor"
        Grid.Row="1"
        VerticalScrollBarVisibility="Auto">
        <ScrollViewer.BindingGroup>
            <BindingGroup/>
        </ScrollViewer.BindingGroup>
        <!-- ici mon formulaire qui est inséré dynamiquement -->
    </ScrollViewer>

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void btnOK_Click(object sender, RoutedEventArgs e)
    {
        scvEditor.BindingGroup.UpdateSources();
    }

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Oui mais attention: il faut préciser que BindingGroup est une propriété dispo à partir de .NET 3.5 SP1

    Sinon, beau travail !

  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
    Citation Envoyé par Thomas Lebrun Voir le message
    Oui mais attention: il faut préciser que BindingGroup est une propriété dispo à partir de .NET 3.5 SP1
    ah tiens, je savais pas... ben ils ont sacrément bien fait de l'ajouter

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Regarde ici pour en savoir plus sur les BindingGroups: http://blogs.msdn.com/vinsibal/archi...alidation.aspx

  10. #10
    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
    Intéressant cet article...

    En fait, le BindingGroup semble plutôt conçu pour appliquer des règles de validation à plusieurs champs, mais moi je l'utilise juste pour retarder la mise à jour de la source... rôle qu'il remplit à merveille

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/01/2009, 11h21
  2. Comment mettre à jour le CD de Delphi 6 ?
    Par Hell dans le forum EDI
    Réponses: 1
    Dernier message: 01/08/2005, 16h39
  3. [Rave Report] Comment mettre à jour le produit
    Par Leesox dans le forum Rave
    Réponses: 2
    Dernier message: 11/04/2005, 21h00
  4. Comment mettre à jour un exécutable ?
    Par rvzip64 dans le forum Langage
    Réponses: 10
    Dernier message: 09/12/2004, 18h43
  5. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 15h56

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