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 Singleton - ViewModel - View


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Points : 60
    Points
    60
    Par défaut Binding Singleton - ViewModel - View
    Bonjour à tous,

    J'ai un problème de binding sur un modèle Singleton-ViewModel-View

    mon infrastructure est la suivante, j'ai une classe Singleton où ma propriété est déclarée.


    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
      public string CurrentMpEvent
            {
                get
                {
                    if (m_CurrentMpEvent == null)
                        m_CurrentMpEvent = MpLibrary.MpEvents.FirstOrDefault();
     
                    return m_CurrentMpEvent;
                }
     
                set
                {
     
                    m_CurrentMpEvent = value;
                               this.NotifyPropertyChanged("CurrentMpEvent");
                }
            }
     
     private void NotifyPropertyChanged(string info)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
    Une autre propriété est créée dans mon ViewModel qui reprendre la propriété créée dans mon singleton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public string CurrentMpEventVM
            {
                get
                {
                    return Singleton.Instance.CurrentMpEvent;
                }
            }
    Finalement, je binde ma view sur la propriété du ViewModel comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       <Label Content="{Binding Path=CurrentMpEventMP, UpdateSourceTrigger=PropertyChanged}" />
    Le problème est lorsque la propriété du Singleton est setté, la notification ne se fait pas (PropertyChanged = null). D'où peut-venir le problème???



    Précision, en bindant directement la view au Singleton, cela marche, mais j'aimerais passer par le viewmodel, il me semble que c'est plus propre et plus flexible...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Label Content="{Binding Source={x:Static da:Singleton.Instance}, Path=CurrentMpEventMV}" />
    Merci d'avance pour vos réponses.

  2. #2
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Hello,

    La propriété CurrentMpEventVM de ton ViewModel ne lève jamais de PropertyChanged ton le binding n'est jamais notifié....

    Ce que tu peux faire c'est exposé le Singleton directement dans le ViewModel mais ce que je préfère en général c'est de mettre le singleton comme une ressource statique dans les resources de l'application et y accéder classiquement... question de goût !

    Bonne soirée,
    Jonathan ANTOINE - Découvrez mon livre: MVVM, de la découverte à la maîtrise.

    Microsoft MVP Client Application Development
    - MCPD Windows 4.0, etc.
    Mon blog : http://www.jonathanantoine.com

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    mais la propriété du singleton est notifiée, et comme ma propriété du view model reprend la propriété du singleton, il me semblait que c'était ok...

    Donc pour toi, il faudrait que je notifie également la propriété du viewmodel ?

    peux-tu m'en dire plus pour le singleton en ressource statique, je n'ai pas bien saisi.

    Merci

  4. #4
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Hello,

    Oui la propriété du Singleton notifie bien des changements, par contre c'est la propriété du ViewModel qui est exposée au binding bien qu'elle ne fait que retourner la valeur du Singleton !

    Pour la resource statique :
    1. Au lancement de l'appli, tu met ton singleton en resource (Resources["monSingleton"] = tonSingleton;
    2. Dans le code tu y accèdes avec dans tes bindings Source={StaticResource monSingleton}


    En éspérant que cela soit clair...
    Jonathan ANTOINE - Découvrez mon livre: MVVM, de la découverte à la maîtrise.

    Microsoft MVP Client Application Development
    - MCPD Windows 4.0, etc.
    Mon blog : http://www.jonathanantoine.com

  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 : 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
    ou alors tu fais simplement un truc comme ça :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <Label Content="{Binding Path=CurrentMpEventMP, Source={x:Static local:Singleton.Instance}}" />

    (la propriété UpdateSourceTrigger ne sert à rien vu que le binding d'un Label est OneWay par défaut, et que d'ailleurs ça ne servirait à rien de le mettre en TwoWay puisqu'un label n'est pas éditable)

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    à Tomlev:

    oui j'ai fait un essai avec le singleton directement appelé en XAML, mais est-ce que c'est vraiment propre ??

    Le singleton sera également utilisé pour la source d'un Tab Control, TextBox...et pas uniquement pour un Label

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Points : 85
    Points
    85
    Par défaut
    Tu peux aussi faire que quand tu settes le singleton, ta VM lances un "NotifyPropertyChanged("")" pour indiquer le changement de tous ces champs. Mais c'est un peu bourrin ^^

  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 : 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 staticx Voir le message
    à Tomlev:

    oui j'ai fait un essai avec le singleton directement appelé en XAML, mais est-ce que c'est vraiment propre ??

    Le singleton sera également utilisé pour la source d'un Tab Control, TextBox...et pas uniquement pour un Label
    Pourquoi ça serait pas propre ? Tu peux utiliser un binding du même genre partout où tu as besoin de binder ce singleton.

    Si tu tiens vraiment à exposer la propriété via le ViewModel, il faut que tu gères l'évènement PropertyChanged du singleton, pour déclencher aussi cet évènement sur le ViewModel. Dans le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Singleton.Instance.PropertyChanged += SingletonPropertyChanged;
    Le handler de l'évènement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void SingletonPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "CurrentMpEventMP")
        {
            NotifyPropertyChanged("CurrentMpEventMP");
        }
    }
    Par contre, fais gaffe quand tu t'abonnes à un évènement d'un objet qui a une longue durée de vie (comme un singleton), surtout si tu dois créer souvent des instances de ton ViewModel : si tu ne te désabonnes pas de l'évènement, le ViewModel restera en mémoire pendant toute la durée d'exécution du programme. A toi de voir quel est le bon moment pour te désabonner, selon le fonctionnement de ton application

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    Pourquoi ça serait pas propre ? Tu peux utiliser un binding du même genre partout où tu as besoin de binder ce singleton.

    Si tu tiens vraiment à exposer la propriété via le ViewModel, il faut que tu gères l'évènement PropertyChanged du singleton, pour déclencher aussi cet évènement sur le ViewModel. Dans le constructeur :
    Dans le cas où tu veux modifier ta propriété (affichage, format...), il y a les converters OK, mais perso je préfère ne les utiliser qu'en dernier recours...

  10. #10
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Qu'est ce que tu veux faire de si complexe que les converters ne te conviennent pas ?
    D'ailleurs pourquoi tu ne les aimes pas ?
    Jonathan ANTOINE - Découvrez mon livre: MVVM, de la découverte à la maîtrise.

    Microsoft MVP Client Application Development
    - MCPD Windows 4.0, etc.
    Mon blog : http://www.jonathanantoine.com

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    ce n'est pas une question que ma structure soit complexe, simplement, je n'utilise les Converters que si vraiment je ne peux faire autrement, après, c'est une question de choix

    Mais oui, j'utilise également beaucoup de converters, aucune animosité contre eux rassures toi :-)

    J'ai opté pour la notification du singleton dans le ViewModel et non pas le binding direct du singleton en XAML.

    Merci à tous pour vos réponses!

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

Discussions similaires

  1. Méthodologie Model-View-ViewModel au sein d'une application WPF
    Par Louis-Guillaume Morand dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 12/06/2015, 14h10
  2. [MVVM] Binding View ViewModel
    Par Plawi dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 18/10/2011, 11h29
  3. [MVVM] Binding à un ViewModel depuis le code-behind
    Par Gigi070 dans le forum Windows Presentation Foundation
    Réponses: 23
    Dernier message: 29/03/2010, 17h46

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