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 :

Choix entre DependencyProp et INotifyProp


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut Choix entre DependencyProp et INotifyProp
    Bonjour à tous,
    je me pose la question suivante : lorsque l'on développe une application WPF avec le pattern MVVM, donc beaucoup de bindings dans la partie View;
    pour les propriétés bindées, qu'est ce qui est le mieux : utiliser des Dependency properties ou utiliser des properties qui implémentent INotifiyPropertyChanged ?

    Quelle est la différence entre les 2 ?, pourquoi est ce mieux d'utiliser l'une ou l'autre méthode ?

    Merci beaucoup pour vos avis.

  2. #2
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Tu peux pas sérialiser une DP.

    Les DP sont aussi liées à WPF, donc si tu veux pas que ta classe soit liée à WPF, INotifyPropertyChanged est un meilleur choix.

    Personnellement, je n'utilise les DP que pour développer des éléments qui sont de toute façon liés à WPF : usercontrols, par exemple.

  3. #3
    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
    Citation Envoyé par davcha Voir le message
    Les DP sont aussi liées à WPF, donc si tu veux pas que ta classe soit liée à WPF, INotifyPropertyChanged est un meilleur choix.

    Personnellement, je n'utilise les DP que pour développer des éléments qui sont de toute façon liés à WPF : usercontrols, par exemple.
    +1: les DPs, c'est pour tout ce qui est graphique. De plus, cela oblige ton objet à hériter de DependencyObject

    INotifyPropertyChanged, c'est le mieux pour des objets métiers.

  4. #4
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    De plus les DP ne sont accessibles que depuis le thread qui les a créé.

    Tu as un article sur la question ici:
    http://kentb.blogspot.com/2009/03/vi...os-versus.html
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut
    Ok, merci pour vos réponses.

    Dans le projet que je suis en train de développer, les données (Model), sont sous forme de Tree Xml; j'utilise donc des Bindings avec des Xpath pour me "brancher" sur le tree Xml; pour faire ces bindings (pour le moment), j'utilise le SetBinding du FrameworkElement, celui-ci nécessite d'utiliser une dependencyProperty.

    Maintenant, si j'utilise l'interface InotifyPropchanged à la place des DPs, quelle solution est ce que j'ai pour binder mes prop (utilisant NotifyPropChanged) avec un XPath sur mon document Xml ?

  6. #6
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Tu pourrais mettre un bout de code ?
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut
    Plutot qu'un bout de code, je tente une explication + détaillée:

    Imaginons un objet Personne avec 2 DPs: Nom et Age

    Dans ma View,
    on affiche une liste de personnes

    Dans mon modelView, je fais donc une ObservableCollection<Personne>.

    Mon Model est un fichier Xml:

    <Personne Id=1>
    <Nom>Toto</Nom
    <Age>30</Age
    </Personne>
    <Personne Id=2>
    <Nom>Titi</Nom
    <Age>32</Age
    </Personne>
    Le constructeur de Personne est :
    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
     
    public Personne(int ID)
    {
       SetBinding(NameProperty, new Binding
                {
                    Source = MonDocXML,
                    XPath = \Personne[@Id="ID"]\@Nom
                    Mode = BindingMode.TwoWay,
     
                });
     
    SetBinding(AgeProperty, new Binding
                {
                    Source = MonDocXML,
                    XPath = \Personne[@Id="ID"]\@Age
                    Mode = BindingMode.TwoWay,
     
                });
     
     
    }
    Et ensuite j'ajoute des objets Personne dans mon observableCollection, et dans ma vue je binde ma liste sur l'observableCollection.

    Dans cet exemple, tout fonctionne très bien mais "Nom" et "Age" sont de DepencyProperties, donc je peux faire un "SetBinding" avec un XPath.

    Comment faire la même chose sans passer par des DPs ?

    Je ne sais pas si cet exemple est assez clair pour illustrer ...

  8. #8
    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
    Oula, je ne suis pas sur de comprendre.....

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 77
    Points : 78
    Points
    78
    Par défaut
    Effectivement, ce n'est pas très clair même si je crois avoir une idée de ce que tu souhaites faire.

    L'objet Personne à mon avis n'a pas lieu d'exister ici, puisque ta View peut se binder directement (en utilisant Binding avec XPath) à ta source de donnée qui est le fichier XML.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut
    Ok ... c'est à quel endroit que ce n'est pas clair ?

    Sinon, ma View peut effectivement binder directement sur le fichier XML, mais mes requêtes XPath sont plus complexes que dans cet exemple, j'ai des paramètres dans mes requêtes que je n'arrive pas à placer depuis le XAML.

    Une autre chose: supposons que la liste doit être triée dans un certain ordre, est ce possible si on binde directement depuis la vue ?

    Merci.

  11. #11
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Soit tu bindes directement ton fichier XML à ton UI...
    Soit tu charges ton fichier XML dans un graphe que tu bindes à ton UI.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par davcha Voir le message
    Soit tu charges ton fichier XML dans un graphe que tu bindes à ton UI.
    Tu entends quoi par "un graphe" ?

  13. #13
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Sans doute un graphe d'objets c'est à dire une représentation orientée objet de ton arborescence XML.

    Ca se fait via de l'XML data-binding et c'est bien intégré à .Net.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut
    Oui Ok, ça d'est déja fait, mon arborescence xml est sous forme d' XmlDataProvider, et je binde sur cet objet.
    Pour binder sur cet objet, je passe par du XPath, mais je le fais par du code C# car les requêtes sont trop compliquées pour être faites directement en Xaml, maintenant la question est: Comment binder sur cet objet (avec du XPath) sans passer par des DependencyProperties et des DependencyObject ?

  15. #15
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 77
    Points : 78
    Points
    78
    Par défaut
    Ce qu'il entend par graphe d'objet c'est de faire un traitement en deux phases.

    1ere phase : Tu crées des classes Persone et tu charges ton fichier XML dans ces classes là. Autrement dit tu transforme ta balise <personne> ... </personne> en un objet Personne (avec ou sans DP).

    2e phase : Tu binde ta view sur ton objet Personne et non plus sur le XML.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut
    Ok, et dans ce cas comment est ce que les données sont mises à jour si il y a un changement directement dans le xml ?

    (D'ou ma volonter de Binder les propriétés de mon objet Personne sur le XML... )

  17. #17
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 77
    Points : 78
    Points
    78
    Par défaut
    C'est bien ce que j'ai compris de ce que tu veux faire, mais malhereusement il n'existe pas encore l'équivalent du "ObservableCollection" pour les fichiers Xml (une sorte d'"ObservableXml") ... Une fonctionalité très intéressante à créer et à proposer à Microsoft ssi il y a des motivés ..

    Le binding n'est pas si magique que ca et ne marche que si l'objet sur lequel tu te bindes notifie qu'il a eu des changements. Aujourd'hui, l'objet XmlDocument ne possède pas ce comportement et donc meme si tu arrives à te binder desus correctement, une modification dans ton fichier Xml ne se verra pas en "live" dans ta View.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut
    Si si, ça, ça marche, je l'ai fait.
    C'est pas un fichier xml, mais un treeView sur lequel je fais mon binding.

    Par contre pour faire cela je fais un "SetBinding" (de frameworkElement) avec un binding dont la propriété XPath pointe sur le bon endroit de mon TreeXml.
    Mon objet en question doit donc hériter de FrameworkElement pour pouvoir utiliser cette fameuse méthode "SetBinding"...

    => d'ou l'ouverture de ce post de ma part pour savoir si j'avais d'autres solutions que le dependencyObject pour me binder en live a un mon TreeXml...

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 87
    Points : 34
    Points
    34
    Par défaut
    La question pourait être reformulée comme ça: peut-on se binder sur un TreeXml avec XPath, en étant complètement indépendant de WPF ... ?

  20. #20
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Tu veux faire du Binding WPF sans WPF ?...

Discussions similaires

  1. Choix entre deux champs dans une requete
    Par Pico10 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/07/2005, 15h36
  2. a href : choix entre OUVRIR ou TELECHARGER
    Par lepierre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 21/06/2005, 14h51
  3. choix entre dbexpress et objet interbase
    Par hani dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/11/2004, 23h09
  4. Conseille Choix entre MySQL et InterBase?
    Par Redhouane dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/09/2004, 11h42
  5. choix entre macro et fonction
    Par remi77 dans le forum C
    Réponses: 4
    Dernier message: 22/10/2003, 14h26

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