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 :

Ecoute UDP + affichage des données


Sujet :

Windows Presentation Foundation

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut Ecoute UDP + affichage des données
    Bonjour,

    je vous explique mon problème.

    Je développe une petite application qui écoute sur un port en UDP et qui affiche les données interceptées à l'écran.

    Mon application est constituée de deux projets visual : le module d'écoute UDP et module graphique WPF.

    J'aimerai afficher les données reçues à partir du module d'écoute, directement dans une fenêtre du module graphique.

    Auriez-vous une idée de la solution à adopter?

    Merci pour votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Ton module d'ecoute envoie de la donnée au fur et à mesure je suppose.
    Pour faire propre et utiliser le modele mvvm, il te faudrait :

    - Une vue Xaml (dans laquelle tu as un textbox par exemple, bindé sur une property de ton viewmodel)
    - Un view model qui instancie ta classe d'ecoute UDP

    Dans ton view model tu instancie ton ecoute udp et à chaque fois que tu recois des paquets, tu mets à jour ta property "DatasUDP" en prenant soin d'effectuer le lancement de l'evenement propertyChanged (voir implementation de l'interface INotifyPropertyChanged).

    Et le tour est joué

    Edit : Apres, si tu veux agrémenter le truc, tu ajoutes deux commandes à ton view model : une commande demarrer, une commande arreter, qui respectivement demarreront et arreteront ton ecoute UDP.
    Ces deux commandes seront alors bindées sur deux boutons dans ta vue xaml.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut
    Merci pour ta réponse rapide!

    C'est très interessant ce que tu me dis.

    Pourrait-tu m'expliquer ce qu'est un view model et comment je dois procéder pour le modéliser? Car ce passage n'est pas clair pour moi :

    [...] d'effectuer le lancement de l'evenement propertyChanged (voir implementation de l'interface INotifyPropertyChanged).
    Merci

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    Voici un tutoriel sur le pattern MVVM :
    http://japf.developpez.com/tutoriels...-et-testables/

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut
    Ah merci. Je connaissais le pattern MVC simple, mais pas cette variante.

    Merci beaucoup.

  6. #6
    Membre averti
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 18
    Par défaut
    Bonjour,

    tu peux aussi utilizer le pathern "Composite Windows Presentation Foundation" (CWPF) qui est tres bom aussi

    http://www.codeplex.com/CompositeWPF

    a plus

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut
    Bonjour,

    après plusieurs tentatives, j'ai des difficultés à implémenter ma solution avec le Model View ViewModel.

    En fait, je n'arrive pas à lever l'évènement PropertyChanged. Dès qu'une modification se produit ça plante car on me dit que PropertyChanged vaut null...

    J'ai épluché plusieurs exemples sur le net, mais rien n'y fait...

    Pourriez vous m'éclairer là-dessus?

    Merci.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Tu codes en quoi ? C# ou VB ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut
    Je code en C#. Je galère grave à vrai dire

    J'ai essayé de faire ce que tu m'as indiqué hier. J'instancie l'écoute UDP dans le ViewModel. Dans mon module d'écoute j'ai une variable paquetCourant qui reçoit le paquet courant et lève l'évènement PropertyChanged à chaque modif. Là j'essaye de binder la property avec un textbox ...

    Je sais pas si c'est la bonne démarche

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Pas sur que ce soit comme cela.
    Imaginons ton projet comme ceci :

    Vue.xaml <- VueModele.cs <- ClasseEcoute.cs

    Classe ecoute.cs devrait lever un evenement lorsque tu reçois un nouveau paquet (avec eventuellement ton paquet en parametre, ça c'est toi qui choose)

    Dans VueModele.cs :
    Tu dois créer une property Paquet et dans son Setter (partie set), juste après ton _Paquet = value; tu places un raiseevent PropertyChanged(this, new PropertyChangedEventArgs("Paquet").
    Cela sert à indiquer à la vue que ta propriété a changé et donc que la vue doit se mettre à jour.

    Ensuite, tu créé ton instance de classeEcoute, tu te branche sur l'evenement de classeEcoute (on va le nommer NouveauPaquetArrivé pour faire simple).
    Dans la méthode qui est connectée à cet evenement, tu sette la propriété en faisant un this.Paquet = lepaquetReçuParL'evenement
    Cela permet de passer dans le setter de la propriété et de lancer l'evenement propertyChanged à la vue.

    Dans Vue.xaml, tu dois avoir un controle de texte, on va prendre pour l'exemple un label :
    <Label Content={Binding Paquet} />

    Par contre, il faut penser à ajouter ton objectDataProvider dans les resources de ta vue.
    Donc en gros :

    dans les declarations de namespace sur la balise Window : ajoute ton name space (l'autocompletion devrait t'aider)

    xmlns:c="clr-namespace:Ton.Namespace.de.ton.projet"

    puis dans les resources :

    <Window.Resources>
    <ObjectDataProvider x:Key="ObjEcouteUdp" ObjectType="{x:Type c:VueModele}" />
    </Window.Resources>

    Bon courage

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut
    Oui c'est à peu près ça que j'avais compris... mais en fait la partie qui me pose problème c'est clairement celle là :

    Ensuite, tu créé ton instance de classeEcoute, tu te branche sur l'evenement de classeEcoute (on va le nommer NouveauPaquetArrivé pour faire simple).
    Dans la méthode qui est connectée à cet evenement, tu sette la propriété en faisant un this.Paquet = lepaquetReçuParL'evenement
    Cela permet de passer dans le setter de la propriété et de lancer l'evenement propertyChanged à la vue.
    Justement je ne comprends pas comment me "brancher" sur l'évènement.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Ta classe Ecoute UDP expose-t-elle bien un evenement qui est déclenché lorsque tu recois un nouveau paquet ?

    Si oui, admettons que ton evenement s'appelle comme ceci :
    Classe : EcouteUPD
    evenement : NouveauPaquetRecu
    nom de l'instance dans ton viewmodel : _EcUDP

    Eh bien dans ton viewmodel tu dois avoir un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void ChargerInstance()
    {
    EcouteUPD _EcUDP = new EcouteUPD()
    _EcUDP.NouveauPaquetRecu += HandleNouveauPaquet;
    }
     
     void HandleNouveauPaquet(string lePaquet)
      {
    // Ici tu settes la property Paquet de ton viewModel
    Paquet = lePaquet;
      }
    Je ne suis pas trop à l'aise en C# car je code essentiellement en vb mais ca doit à peu pres etre ca ^^


    edit : http://msdn.microsoft.com/fr-fr/libr...68(VS.80).aspx

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut
    Bon ça commence à s'éclaircir. Merci pour ton aide en tout cas.

    j'ai créé l'évènement qui me manquait dans ClasseEcoute puis je lève cet évènement à chaque paquet reçu.

    Du coup, après quelques recherches dans la doc que tu m'as fourni, j'ai ça dans mon ViewModel :

    (monEcouteUDP une instance de ClasseEcoute)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
           private void MethodTest()
            {
                monEcouteUDP.nouveauPaquetRecu+= HandleNouveauPaquet;
            }
     
            private void HandleNouveauPaquet(object sender, PaquetEventArgs f)
            {
                Paquet+= f.nouveauPaquet;
            }
    Ca me paraît correct Cependant j'ai un problème avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Window.Resources>
    <ObjectDataProvider x:Key="ObjEcouteUdp" ObjectType="{x:Type c:VueModele}" />
    </Window.Resources>
    J'ai un message d'erreur qui me dit "Descripteur invalide" ... C'est vague ^^ Pourtant le namespace est bon ...

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Tout d'abord : c'est normal que tu aies un += dans

    private void HandleNouveauPaquet(object sender, PaquetEventArgs f)
    {
    Paquet+= f.nouveauPaquet;
    }

    ??? Pourquoi Paquet+= f.nouveauPaquet ?

    Ensuite concernant l'object dataprovider :

    Tu dois definir un object dataprovider qui pointe sur le nom de ta classe viewmodel
    Grosso modo, ceci :

    <Window.Resources>
    <ObjectDataProvider x:Key="ObjEcouteUdp" ObjectType="{x:Type c:VueModele}" />
    </Window.Resources>

    Veut dire : je met à disposition dans mon xaml une instance de Type VueModele à disposition dans les resources. Comme ca, des que tu créés un controle en xaml avec un binding, il ira chercher là dedans (faut penser à placer le datacontext là ou il faut bien entendu.)
    Envoies moi ton xaml complet ce serait plus simple

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut
    C'est réglé pour le XAML et ça fonctionne :-)

    En fait Paquet += f.nouveauPaquet;, c'était volontaire de ma part, pour concaténer mes paquets et les afficher à la suite dans un textbox. Juste pour le test

    Je te suis vraiment reconnaissant pour ton aide C'était pas gagné car je ne connaissais pas du tout ce pattern de développement. Je vais essayer d'appliquer cela pour le reste de mon application.

    Sûrement à plus tard sur le forum et merci encore

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    De rien
    Juste pour info (et pour les autres aussi), quel etait le probleme que tu rencontrais ?

    Concernant le design pattern MVVM, franchement, je l'ai découvert il y a 2-3 semaines, et j'ai de suite adopté, niveau codage, possibilités offertes et maintenance c'est un régal !
    Au debut la gymnastique est assez compliquée, on se demande toujours comment faire ceci, comment faire cela mais au final c'est génial !
    Perso je me garde ces regles dans un coin de ma tete pour me souvenir comment MVVM doit etre implémenté (c'est assez réducteur mais ca aide quand meme) :
    - La vue = le xaml : moins y'a de code behind (le fichier source cs ou vb associé au xaml) mieux c'est.

    - Le modele = objets metier. Ce sont les classes qui savent vivre seules et qui contiennent l'information ou les traitements purement métier. Si je supprime les vues modeles et les vues, il n'y a aucune erreur dans mes modeles

    - La Vue-Modele : permet d'associer les deux premier et de federer le tout. Mes vues modeles doivent pouvoir vivre sans le xaml (si je supprime la vue, aucune erreur).

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Par défaut
    Oui voilà c'est exactement ça, la gymnastique est compliquée au début. J'avais les connaissances du patron MVC mais le MVVM a quelques subtilités en plus que je connaissais pas.

    Le principe du patron ne me posait pas de problèmes particuliers, c'était plus la mise en oeuvre technique. De plus, je suis tout nouveau en WPF et la gestion des évènements ne m'était pas familière ...

    C'est vrai que ce patron me facilite la vie maintenant et je pense qu'il va m'éviter bon nombre d'ennuis, notamment pour la maintenance du code.

    En bref, je développe la tête au clair

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par jean-pierre96 Voir le message
    Oui voilà c'est exactement ça, la gymnastique est compliquée au début.
    Tout à fait ! Mais tu verras qu'a force de "manipuler", cela viendra tout seul

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

Discussions similaires

  1. [MySQL] Affichage des données d'une base
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 30
    Dernier message: 01/02/2006, 16h35
  2. [Tableaux] Affichage des données par lot
    Par randriarabe dans le forum Langage
    Réponses: 1
    Dernier message: 07/12/2005, 08h23
  3. pb d'affichage des données
    Par new_wave dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 03/11/2005, 17h31
  4. TDBCtrlGrid - Affichage des données
    Par audreyb dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/10/2004, 13h10
  5. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07

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