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

C# Discussion :

Mise a jour de View MVVM


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut Mise a jour de View MVVM
    Bonjour,

    Je recherche à mieux comprendre le fonctionnement du MVVM.

    Je donne pour exemple mon cas pour apprendre à utiliser du bon fonctionnement.

    J'ai donc ma view qui est binder sur ceci : public EntityCollection<CommandeFournisseurLigne> CommandeFournisseurLignes
    qui est donc disponible depuis mon ViewModel.

    Ma question est comment signaler à ma vue que cette collection à changée ? Ou comment signaler qu'une ligne de la BDD a été modifié ?

    Lequel de mon ViewModel ou Model doit implémenter InotifyPropertyChanged ? Lequel doit RaisePropertyChanged ?


    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    C'est toujours le modèle ViewModel qui doit implémenter "INotifyPropertyChanged", pas la vue. Les objets des interfaces utilisateurs vont systématiquement s'abonner à "PropertyChanged" dès qu'elle voient qu'un objet databindé implémente "INotifyPropertyChanged".
    Ensuite, c'est l'objet qui implémente "INotifyPropertyChanged" qui est responsable des moments où il déclenche les "PropertyChanged".

    Si tu communique en plus avec une BDD, normalement la vue (View et non pas ViewModel) ne doit pas communiquer directement avec les objets de la BDD mais avec les objets du modèle ViewModel. C'est le modèle ViewModel qui communique directement avec la BDD ([EDIT] qui est le modèle)
    Dernière modification par Invité ; 27/06/2014 à 13h15.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut
    Citation Envoyé par Ph_Gr Voir le message
    Bonjour,


    Si tu communique en plus avec une BDD, normalement la vue ne doit pas communiquer directement avec les objets de la BDD mais avec les objets du modèle. C'est le modèle qui communique directement avec la BDD.
    Dans mon ViewModel j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public EntityCollection<CommandeFournisseurLigne> CommandeFournisseurLignes
            {
                get { return ObjectEntity.CommandeFournisseurLignes as EntityCollection<CommandeFournisseurLigne>; }
            }

    Donc c'est bien un objet retourné par mon ViewModel, cela ne respect pas le MVVM ?
    Si non comment dois-je procéder ? Faut-il que je créer un Objet de type intermédiaire que je met dans une Observable collection ?



    Quelque chose du 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
     private ObservableCollection<CommandeFournisseurLigneViewModel> _test = null;
            public ObservableCollection<CommandeFournisseurLigneViewModel> test
            {
                get
                {
     
                    if (_test == null)
                    {
                        _test = new ObservableCollection<CommandeFournisseurLigneViewModel>(
                            (from CFL in DataAccess.EntitiesContext.Context.CommandeFournisseurLignes
                             where CFL.IDCommandeFournisseur == CommandeFournisseur.ID
                             select CFL).ToList().Select(CFL => new CommandeFournisseurLigneViewModel(CFL)));
                    }
     
                    return _test;
     
                }
                set { _test = value; }

    C'est bien cela ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ah oui, j'avais confondu des termes. Dans MVVM c'est vrai qu'il y a 3 parties et j'avais confondu View et ViewModel.
    Du coup je t'ai dit une ânerie, c'est bien dans le ViewModel que tu dois mettre tes INotifyPropertyChanged, puisqu'en l'occurrence ton modèle c'est ta BDD.
    Au temps pour moi...
    Dernière modification par Invité ; 27/06/2014 à 13h16.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut
    Ok,

    Par contre si tu as un petit Sample ou Tuto avec de belles explications sur le InotifyPropertyChanged et comment s'en servir proprement je veut bien.

    Merci beaucoup.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Suite à une petite recherche sur le web, je trouve celui-ci par exemple...

    Après, une petite astuce si tu es en Framework 4.5 pour le "RaisePropertyChanged" (ou NotifyPropertyChanged dans l'exemple) : grâce au nouvel attribut CallerMemberName, tu peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void RaisePropertyChanged([CallerMemberName] string propertyName = "")
    {
       PropertyChangedEventHandler handler = this.PropertyChanged;
       if (null != handler)
          handler(this, new PropertyChangedEventArgs(propertyName));
    }
    et tu l'utilises ainsi dans l'une de tes propriétés pour signaler le changement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private int _monChamp;
    public int MaPropriete
    {
       get{ return _monChamp; }
       set
       {
          if (_monChamp != value)
          {
              _monChamp = value;
              RaisePropertyChanged(); //Equivalent dans ce cas à RaisePropertyChanged("MaPropriete")
          }
       }
    }
    L'avantage est que si tu fais un refactoring pour renommer la propriété, pas besoin d'aller chercher dans le code les appels à la propriété.

Discussions similaires

  1. Grid view :Ajout Suppression Mise a jour Selection
    Par Ya7yaKech dans le forum ASP.NET
    Réponses: 2
    Dernier message: 14/04/2009, 20h19
  2. [Eclipse RCP] Interactions et mise à jour des views
    Par Angelure dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 18/02/2009, 15h22
  3. Mise a jour mandrake linux 9.2
    Par Otacan dans le forum Mandriva / Mageia
    Réponses: 2
    Dernier message: 02/04/2004, 22h47
  4. [] [Install] Problème de mise à jour des dll
    Par pepper dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 23/01/2003, 22h34
  5. Visualisation des mise à jour en réseau
    Par fandor7 dans le forum Paradox
    Réponses: 2
    Dernier message: 06/12/2002, 15h54

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