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 :

A la découverte de .NET et MVVM


Sujet :

C#

  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 583
    Points
    3 583
    Par défaut A la découverte de .NET et MVVM
    Bonjour à tous,
    Je suis initialement développeur Java mais je suis confronté depuis quelques mois à C# dans mon nouveau travail. Me voici donc à la découverte de nombreux projets intéressants tels que WPF et Linq.
    J'ai trouvé de nombreux tutos sur internet m'expliquant la syntaxe C#, le fonctionnement des frameworks etc, mais je n'ai rien trouvé de réellement claire sur les bonnes habitudes de développement et la manière d'organiser son code. En habitué du pattern MVC, j'ai trouvé ce qui me semble être l'équivalent avec MVVM, mais j'ai encore un peu du mal...
    Je serais donc reconnaissant si quelqu'un qui a l'habitude de développer avec ce pattern me donnait des conseils généraux sur la manière de s'y prendre, ou m'indiquait un tutoriel sur la conception, plus que sur la syntaxe (en français, si possible...)

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 250
    Points : 420
    Points
    420
    Par défaut
    Bonjour,
    voici un petit tuto qui devrait t'éclairer.

    http://japf.developpez.com/tutoriels...-et-testables/

  3. #3
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 583
    Points
    3 583
    Par défaut
    Bonjour,
    Merci effectivement j'avais déjà lu ce tuto à la va vite il y a longtemps et je l'avais complètement oublié depuis.

  4. #4
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Celui-ci n'est pas en français, mais si tu comprends à peu près l'anglais ça vaut la peine de le lire, c'est un peu l'article qui a "lancé" MVVM

    http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

  5. #5
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 583
    Points
    3 583
    Par défaut
    Je vous remercie pour ces deux liens intéressants.
    J'ai cependant des questions plus précises sur la manière dont les classes communiquent entre elles.
    Admettons que je veuille travailler sur des objets voitures, à afficher dans une treeview. Dans mon application, j'ai donc mon Model avec mes objets, un dictionary de voitures. Dans ViewModel, j'ai mon contrôleur qui a une ObservableCollection d'objets voiture correspondant à celle présent dans le modèle, mais selon un autre type d'objet, qui ne contient que l'id de la voiture et implémentant INotifyPropertyChanged, afin que la treeview se mette à jour simplement par DataBinding dans ma View.

    C'est actuellement ce que j'ai codé, mais tout est brouillon dans ma tête. Au début, ne voulant pas faire de redondance, j'avais fait implémenter INotifyPropertyChanged à ma classe voiture, et j'avais créer un ObservableDictionnary, mais je n'arrivais pas par DataBinding à mettre à jour la treeview comme il faut. Maintenant, j'ai deux objet voiture différent, un contenant réellement toutes les données avec les attributs, et l'autre ne contenant que l'id mais pouvant être afficher, et je vais ainsi récupérer le vrai objet avec l'id quand l'utilisateur selectionne celui afficher. Mais en plus de la redondance, j'ai aussi des risques qu'une des collections ne soit pas exactement similaire à l'autre, et je ne connais rien qui existe pour qu'elles soit identique automatiquement...

  6. #6
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Voilà ce que je fais d'habitude : pour chaque classe du modèle qui devra être représentée ou manipulée dans l'interface, je crée un ViewModel correspondant avec juste les propriétés nécessaires. Le ViewModel garde une référence vers le modèle dans un champ privé. Si une des propriétés du modèle pointe vers une autre classe du modèle, je reproduis cette relation entre les ViewModel

    Par exemple, avec une classe Voiture qui a une propriété de type Moteur :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Voiture
    {
        public Moteur Moteur { get; set; }
    }

    Je vais créer 2 ViewModels comme ceci (en gros...) :

    Code C# : 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
    24
    25
    26
    27
    28
    29
    30
    public class VoitureViewModel : ViewModelBase
    {
        private readonly Voiture _model;
        public VoitureViewModel(Voiture model)
        {
            _model = model;
            _moteur = new MoteurViewModel(_model.Moteur);
        }
     
        private MoteurViewModel _moteur;
        public MoteurViewModel Moteur
        {
            get { return _moteur; }
            set
            {
                _moteur = value;
                OnPropertyChanged("Moteur");
            }
        }
     
    }
     
    public class MoteurViewModel : ViewModelBase
    {
        private readonly Moteur _model;
        public MoteurViewModel(Moteur model)
        {
            _model = model;
        }
    }

    Mais ce n'est sans doute pas la seule façon de procéder... selon le besoin il faudra sans doute adapter un peu

  7. #7
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Cela dit, un treeview c'est ptet pas le contrôle le plus simple à utiliser lorsqu'on débute en MVVM

  8. #8
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 583
    Points
    3 583
    Par défaut
    @tomlev, oui, mais ça te fait créer beaucoup de nouvelle classe, et je voulais éviter cette redondance, parce que là c'est bien pour l'affichage, mais si l'utilisateur doit modifier moteur, il faut que la modification se répercute dans le model...

    @PitMaverick, certe, mais après avoir un peu chercher c'est l'idéal pour mon cas, car j'ai des dictionnaires en série... Un dictionnaire d'objet qui ont chacun un dictionnaire qui ont eux même chacun un dictionnaire. Et grâce à un treeview, je peux les afficher comme dans l'explorateur windows, avec des items et des expand..

  9. #9
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    si l'utilisateur doit modifier moteur, il faut que la modification se répercute dans le model...
    Oui, j'y ai pensé en l'écrivant, mais j'ai eu la flemme de compléter le code
    Ca devrait pas être trop compliqué à gérer de toutes façons

  10. #10
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 583
    Points
    3 583
    Par défaut
    Je suis en effet en train de me rendre compte que TreeView c'est pas le plus simple à aborder haha. Je souhaite récupérer l'objet qui vient de perdre le focus, j'ai donc créé un handler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EventManager.RegisterClassHandler(typeof(Control), TreeViewItem.UnselectedEvent, (RoutedEventHandler)ItemUnselected);
    Qui appelle la méthode ItemUnselected :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ItemUnselected(object sender, RoutedEventArgs e)
            {
                TreeItemDisplay itemUnselected = (TreeItemDisplay)(TreeViewItem)e.OriginalSource;
                itemUnselected.IsSelected = false;
            }
    Mais à l'execution, je me tape un joli
    Unable to cast object of type 'System.Windows.Controls.TreeViewItem' to type 'OVTacOps5.ViewModels.TreeItemDisplay'.
    TreeItemDisplay étant ma classe "readonly" pour l'affichage. Comment récupérer l'objet correspondant au TreeViewItem que j'ai là si je ne peux pas caster directement ? J'ai fait ça pour la sélection sur TreeView.SelectedItem et ça marchait...

  11. #11
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    C'est logique, il n'y a aucun lien d'héritage entre un TreeViewItem et un TreeItemDisplay, donc tu ne peux pas caster l'un vers l'autre... l'objet de données correspondant à un TreeViewItem est dans le DataContext :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TreeViewItem tvi = (TreeViewItem)e.OriginalSource;
    TreeItemDisplay itemUnselected = (TreeItemDisplay)tvi.DataContext;
    itemUnselected.IsSelected = false;

  12. #12
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 583
    Points
    3 583
    Par défaut
    Ca marche, merci beaucoup !
    Je me rends compte que j'ai encore une notion très floue du fonctionnement du DataBinding et de ce qu'est le DataContext..

  13. #13
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    Ca marche, merci beaucoup !
    Je me rends compte que j'ai encore une notion très floue du fonctionnement du DataBinding et de ce qu'est le DataContext..
    Enfait les éléments graphiques (Grid, Button, UserControl, etc) ont aucun contexte métier (logique). Il est possible à des fins de binding justement de lier un objet visuel a un objet métier: le DataContext.

  14. #14
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 250
    Points : 420
    Points
    420
    Par défaut
    En gros le datacontext de MonUserControl.xaml, c'est MonUserControlViewModel.cs.

    Et une listview, sera bindée à une ObservableCollection<T> (qui sera une propriété Public de ton ViewModel).

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

Discussions similaires

  1. Problème de compilation de l'exemple MVVM de la découverte à la maîtrise
    Par lerieure dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 24/01/2013, 11h48
  2. [C# - .Net] MVVM : ListBox->ObservableCollection->List ?!
    Par MedyAndFriends dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 27/03/2012, 08h46
  3. ADO.NET - Silverlight 4 - MVVM
    Par Alkaza dans le forum Silverlight
    Réponses: 6
    Dernier message: 19/05/2011, 13h04
  4. Projet php à la base, mais découverte de .NET
    Par ophalia dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 05/05/2007, 09h53

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