Partage
  • Partager sur Facebook
  • Partager sur Twitter

[WPF - C# - MVVM] Notification du ViewModel par le Model

Sujet résolu
    4 mars 2011 à 0:42:11

    Bonjour,

    Je suis en train de faire un client de messagerie. J’arrive a me connecter au serveur, discuter, recevoir des messages...
    Mon probleme est que j'aimerai decouper mon code, et ne pas tout mettre dans le code behind de ma vue. Je me suis documenter un peu sur le pattern MVVM (Model-View-ViewModel), mais le soucis c'est que lorsque que je met le code qui etait dans le code behind dans une classe, une exception est leve lorsque je tente de me connecter au serveur, voila le code :

    _Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _ConnectEvent = new SocketAsyncEventArgs();
                _ConnectEvent.Completed += new EventHandler<SocketAsyncEventArgs>(sock_connect_completed);
                _ConnectEvent.RemoteEndPoint = _END_POINT; // DnsEndPoint
                _ConnectEvent.UserToken = _Sock;
                _Sock.AcceptAsync(_ConnectEvent); // L'exception est levé ici.
    


    Le message de l'exception est : You must call the Bind method before performing this opération.
    Je ne comprends pas pourquoi je dois appeler Bind.

    Merci d'avance de vos réponses.

    PS : J'ai une autre question, comment puis-je notifier mon ViewModel depuis mon Model qui utilise des CallBack asynchrone ? (j'ai essayer de creer des fonction delegate et utilise invoke, pour faire la notification mais ca n'as pas l'air de marcher.)

    EDIT : Changement du titre.

    • Partager sur Facebook
    • Partager sur Twitter
      4 mars 2011 à 13:33:50

      Tu n'appelles pas la méthode AcceptAsync() au bon moment. Je t'invite à consulter la doc, tu verras qu'il est effectivement nécessaire d'appeler les méthodes Listen() et Bind() auparavant ;)

      Citation

      PS : J'ai une autre question, comment puis-je notifier mon ViewModel depuis mon Model qui utilise des CallBack asynchrone ? (j'ai essayer de creer des fonction delegate et utilise invoke, pour faire la notification mais ca n'as pas l'air de marcher.)


      Crée des événements pour ton Model et fais en sorte que ton ViewModel "écoute" ces événements.
      • Partager sur Facebook
      • Partager sur Twitter
        7 mars 2011 à 17:10:55

        Citation : Orwell

        Tu n'appelles pas la méthode AcceptAsync() au bon moment. Je t'invite à consulter la doc, tu verras qu'il est effectivement nécessaire d'appeler les méthodes Listen() et Bind() auparavant ;)

        Citation

        PS : J'ai une autre question, comment puis-je notifier mon ViewModel depuis mon Model qui utilise des CallBack asynchrone ? (j'ai essayer de creer des fonction delegate et utilise invoke, pour faire la notification mais ca n'as pas l'air de marcher.)


        Crée des événements pour ton Model et fais en sorte que ton ViewModel "écoute" ces événements.



        Bonjour,

        Désolé, j'ai fait une fautes de frappe dans mon code, enfaîte je voulais appelé la méthode ConnectAsync(), du coups maintenant ça marche.
        J’hérite de l'interface INotifyProperty dans mon Model et je crée bien l’évènement, mais je ne sais pas comment écouter cet évènement dans mon ViewModel, aurais-tu une piste, ou un lien par ou je pourrais commencer a chercher ?

        Merci de ta réponse :)
        • Partager sur Facebook
        • Partager sur Twitter
          7 mars 2011 à 17:45:33

          Si ton modèle implémente l'interface INotifyPropertyChanged, tu peux accrocher un gestionnaire à son événement PropertyChanged comme ceci:

          public class MyViewModel
          {
              private MyModel _model;
          
              public MyViewModel()
              {
                  _model = new MyModel(); // ou tout autre façon de récupérer une instance de ton modèle
                  _model.PropertyChanged += new PropertyChangedEventHandler(OnModelPropertyChanged);
              }
          
              private void OnModelPropertyChanged(object sender, PropertyChangedEventArgs e)
              {
                 // une des propriétés du modèle à été modifiée
                 // le nom de cette propriété est renseignée dans e.PropertyName
          
                 // ...
              }
          }
          


          Tu peux aussi envisager de créer d'autres événements dans ton modèle et les écouter de manière similaire en fonction de tes besoins :)
          • Partager sur Facebook
          • Partager sur Twitter
            7 mars 2011 à 19:27:58

            Citation : Orwell

            Si ton modèle implémente l'interface INotifyPropertyChanged, tu peux accrocher un gestionnaire à son événement PropertyChanged comme ceci:

            public class MyViewModel
            {
                private MyModel _model;
            
                public MyViewModel()
                {
                    _model = new MyModel(); // ou tout autre façon de récupérer une instance de ton modèle
                    _model.PropertyChanged += new PropertyChangedEventHandler(OnModelPropertyChanged);
                }
            
                private void OnModelPropertyChanged(object sender, PropertyChangedEventArgs e)
                {
                   // une des propriétés du modèle à été modifiée
                   // le nom de cette propriété est renseignée dans e.PropertyName
            
                   // ...
                }
            }
            



            Tu peux aussi envisager de créer d'autres événements dans ton modèle et les écouter de manière similaire en fonction de tes besoins :)



            Vraiment merci ça fonctionne très bien maintenant ! Tu m'as vraiment beaucoup aidé !
            • Partager sur Facebook
            • Partager sur Twitter

            [WPF - C# - MVVM] Notification du ViewModel par le Model

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown