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

Silverlight Discussion :

Binding propriété multiplication


Sujet :

Silverlight

  1. #1
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut Binding propriété multiplication
    Bonjour à tous,

    Je développe une application en utilisant MVVM.

    Dans mon entité (Model), je possède 3 propriétés A, B et C.

    A et B sont des objets Quantity, Quantity est une classe qui possède en autre un double Value.

    C = A.Value * B.Value.

    J'affiche mes 3 propriétés dans un tableau et j'aurais voulu qu'a la modification de A ou B, C se mette à jour.
    Ma propriété ressemble donc à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    double C
    {
    get { return A * B ; }
    }
    le problème est que je dois mettre un RaisePropertyChange("C") lorsque je modifie A ou B afin de notifier les bindings sur C que la valeur de C a changé.

    Si je le met dans mes propriété A ou B, ca ne fonctionne pas puisque je modifie A.Value ou B.Value (il ne passe donc pas dans le set de A ou B mais plutot dans Quantity.Value

    En espérant avoir expliqué le plus clairement possible (ce qui est difficile), avez-vous une solution à ce genre de problème ?

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Salut CyberBobby,

    il faudrait dans un premier temps, que ton objet Quantity hérite de INotifyPropertyChanged pour que ta propriété Value puisse notifier ces changements.
    Ensuite dans ton model contenant les propriétés A et B, tu abonnes A & B à un même évènement PropertyChanged (dans le constructeur par exemple). C'est dans cette évènement que tu notifieras les changements de C.

    J'espère avoir été assez clair.
    Bon courage !

  3. #3
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Merci pour ta réponse !

    Euh, serait-il possible d'avoir un peu de code pour illustrer l'abonnement au même événement PropertyChanged ?

    Merci,

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Un truc comme ça ?

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    public MonObjet : INotifyPropertyChanged
    {        
     
    	public MonObjet()
    	{
    		// A et B sont des INotifyPropertyChanged donc possède l'evenement PropertyChanged
    		// On route l'evenement sur la même méthode
    		this.A = new Quantity();
    		this.A.PropertyChanged += PropertyChangedEventHandler(QuantityPropertyChanged);
     
    		this.B = new Quantity();
    		this.B.PropertyChanged += PropertyChangedEventHandler(QuantityPropertyChanged);
     
    	}
     
    private void QuantityPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
    	switch (e.PropertyName)
            {
    		case "Value":
    			this.OnNotifyPropertyChanged("C");
     
    			break;
    	}
    }
     
    public Quantity A
    {
    	get;
    }
     
    public Quantity B
    {
    	get;
    }
     
    public Quantity C
    {
    	get
    	{
    		return A.Value * B.Value;
    	}
    }
     
    // Todo : Implémentation INotifyPropertyChanged
     
    }

  5. #5
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Bonjour Samoteph,

    J'ai essayé comme tu m'as dis mais il ne passe pas dans l'événement PropertyChanged lorsque Value est modifié mais bien lorsque Quantity est modifié.

    Donc, si je fais un A = new Quantity();, il passe dedans ...
    Par contre si je fais un A.Value = 2, il passe bien dans le set de Value mais pas dans celui de Quantity. Et ne passe pas dans le handler PropertyChanged auquel je les ai abonnés.

    Value implémente bien INotifyPropertyChanged.

  6. #6
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Peux-tu poster ta classe Quantity qu'on jette un oeil ?

  7. #7
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Biensûr ...

    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
    26
    27
    28
    29
    30
    31
     
      public class Quantity : INotifyPropertyChanged
        {
            private double _value;
            public double Value
            {
                get { return _value; }
                set { _value = value; RaisePropertyChanged("Value"); }
            }
     
            private bool _iseditable;
            public bool IsEditable
            {
                get { return _iseditable; }
                set { _iseditable = value; RaisePropertyChanged("IsEditable"); }
            }
     
            #region INotifyPropertyChanged Members
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            private void RaisePropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
     
            #endregion
        }

  8. #8
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    J'avais rédigé l'implémentation de MonObjet un peu trop "rapidement" (et sans éditeur).
    Voila je l'ai repris et testé et cela fonctionne :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    	public MonObjet()
    	{
    		// A et B sont des INotifyPropertyChanged donc possède l'evenement PropertyChanged
    		// On route l'evenement sur la même méthode
    		this.A = new Quantity();
    		this.A.PropertyChanged += new PropertyChangedEventHandler(QuantityPropertyChanged);
     
    		this.B = new Quantity();
    		this.B.PropertyChanged += new PropertyChangedEventHandler(QuantityPropertyChanged);
     
            this.C = new Quantity();
    	}
     
    private void QuantityPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
    	switch (e.PropertyName)
            {
    		case "Value":
     
                    if (this.C != null)
                    {
                        this.C.Value = A.Value * B.Value;
                        this.RaisePropertyChanged("C");
                    }
     
    			break;
    	}
    }
     
    public Quantity A
    {
        get;
        private set;
    }
     
    public Quantity B
    {
    	get;
        private set;
    }
     
    public Quantity C
    {
        get;
        private set;
    }
     
    // Todo : Implémentation INotifyPropertyChanged
     
     
        #region INotifyPropertyChanged Members
     
        public event PropertyChangedEventHandler PropertyChanged;
     
        /// <summary>
        /// Raise
        /// </summary>
        /// <param name="propertyName"></param>
     
        public void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.RaisePropertyChanged(propertyName);
            }
        }
     
        #endregion
    }

  9. #9
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Sorry mais selon moi, le problème restera le même, il ne passera pas dans QuantityPropertyChanged.

    Peux-tu me donner ton projet entier ?

    Encore merci,

  10. #10
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par cyberbobby Voir le message
    Sorry mais selon moi, le problème restera le même, il ne passera pas dans QuantityPropertyChanged.

    Peux-tu me donner ton projet entier ?

    Encore merci,
    Ben tu passera dedans si quelque part tu modifies A.Value ou B.Value.

  11. #11
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Ben tu passera dedans si quelque part tu modifies A.Value ou B.Value.
    ben ouai. c'etait pas ça ton problème de base CyberBobby ?

  12. #12
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Justement pas, si je fais un A.Value qq part que ce soit par Binding ou en code Behind, je ne passe pas dedans !

    Voilà mon souci en fait ...

  13. #13
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Jette un coup d'oeil :

    SilverlightApplication3.zip

  14. #14
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Ok, en effet, ça fonctionne nickel dans ton projet !

    Je vais donc essayer de trouver la différence avec le mien ...

    Je vous tiens au courant ...


    Un grand merci !

  15. #15
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Bonjour à tous,

    Je viens de sortir mes classes de mon projet afin de le recréer dans un projet de test et là ca fonctionne.

    Je ne vous ai pas décrit l'architecture que j'utilise.

    En fait, mes entités sont créées coté serveur. Dans le client, j'ai un projet entité ou je les ajoutes toutes par lien (donc, add as link). Lorsque je modifie une entité, je le fais évidemment coté serveur et elle sont donc automatiquement mise à jour coté client.
    Il est évidemment renseigné dans la référence de service d'utiliser ces objets.

    Lorsque je modifie ma valeur, il passe bien dans le set de Quantity, dans le RaisePropertyChanged de Quantity mais pas dans ma méthode PropertyChanged de la classe MonObjet (dans l'exemple de Samoteph).

    Une idée ?

    Merci d'avance,

  16. #16
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Peux-tu poster ton projet pour qu'on jette un coup d'oeil à notre tour ?

  17. #17
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Je ne peux malheureusement pas poster le projet ici.

    Mais j'ai recréé un projet de test similaire ...

    La différence avec celui sur lequel je travaille est qu'ici, tout se trouve dans la même solution. Dans l'autre projet, il y a une solution pour le serveur et une pour le client.

    Mais les références sont liées de la même manière. Et vous constaterez que dans ce cas-ci, il ne passe pas dans le handler.


    Merci pour votre aide,
    Fichiers attachés Fichiers attachés

  18. #18
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Bonjour,

    Avez-vous eu l'occasion de tester mon projet ?

    Merci,

  19. #19
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Oui je viens de regarder.

    Ton problème vient du fait que WCF instancie ces objets sans en déclencher le constructeur (!). Je ne comprends pas pourquoi les concepteurs de WCF ce sont évertués à faire cela, mais c'est un peu enervant. Sans constructeur appelé (pour MonObjet), tu n'instancie ni n'abonnes tes objets quantity et donc pas de notification !

    Pour résoudre ton problème tu peux faire un truc de ce genre :

    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 Quantity A
    {
      get
      {
          if( this._A == null )
          {
               Quantity a = new Quantity();
                a.NotifyPropertyChanged += ...
                this._A = a;
          }
     
          return this._A;
      }
     
      set
      {
         ...
      }
    }

  20. #20
    Membre confirmé Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Je vérifie demain mais je pense bien qu'il passait par le constructeur lorsque je mettais un point de debug dedans.

Discussions similaires

  1. Poblème de binding multiple
    Par Lookoum dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 08/08/2008, 14h20
  2. Binding multiples entre des composants
    Par SaumonAgile dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/12/2007, 10h08
  3. [Databinding] bind sur une propriété d'une collection
    Par herveb dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 11/12/2007, 10h35
  4. Réponses: 7
    Dernier message: 14/11/2007, 19h40
  5. Réponses: 5
    Dernier message: 26/09/2007, 03h34

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