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 :

[débutant] Utilité du MVVM


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut [débutant] Utilité du MVVM
    Bonjour à tous,

    Étant habitué au développement WinForm j'ai un peu de mal à me mettre au WPF, à vrai dire, j'ai l'impression d'y perdre mes cheveux

    J'ai un peu lu ce que je pouvais trouver sur le MVVM mais ai un peu de mal à comprendre.

    En résumé quel est l'utilité d'utiliser le MVVM?
    Est-ce obligatoire?
    Est-il utile de l'appliquer pour tout? Fenêtre Principal, UserControl, ...


    Merci pour vos réponses.

  2. #2
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Bonjour.

    Le MVVM n'est pas obligatoire, non, mais c'est clairement ce qui convient le mieux à WPF/SL. Tout simplement parce que la plateforme se prête si bien au binding que l'on a tendance à systématiser l'usage de modèles implémentant INotifyPropertyChanged et que, une fois on a franchi cette étape, on réalise qu'il est plutôt inutile de rajouter un contrôleur par-dessus ça alors qu'une voix dans notre tête nous hurle de confier ces responsabilités au modèle qui, du coup, devient un ViewModel. Maintenant, il est tout à fait possible de faire du MVC tout en exploitant le databinding dans une plus légère mesure.

    Est-il utile de l'appliquer pour tout ? Oui et non. Oui parce que, encore une fois, c'est quand même le modèle le plus adapté. Et que, même si parfois WPF ne fonctionne pas vraiment avec ce modèle on préférera trouver des substituts (voir MVVM light toolkit dans Google). Non parce que, évidemment, si une fenêtre se compose d'un seul bouton, n'importe quoi fera l'affaire.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 182
    Points : 4 496
    Points
    4 496
    Par défaut
    C'est une habitude à prendre et je ne pense pas que c'est sur ca que tu vas bloquer le plus avec WPF.
    Dès que tu auras pris le pli, tu apprécieras fortement le binding,validation

    (De plus même avec le winform tu avais ce genre de pattern qui était recommandé mvc mvp)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    J'aimerais apprendre le Wpf, tout en pouvant utiliser toutes les fonctionnalités du WPF.
    Est ce que quelqu'un pourrait me montrer un exemple de MVVM par rapport à ce que j'ai pu déjà créer, c'est à dire un UserControl NumericUpDown?

    voici le code XAML

    Code xaml : 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
     
    <UserControl x:Class="Verification_Lotto.NumericUpDown"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="24" Width="100">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="75"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
     
            <TextBox Name="txtNum" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" PreviewKeyDown="txtNum_PreviewKeyDown" LostFocus="txtNum_LostFocus"></TextBox>
            <RepeatButton Name="btPlus" Grid.Column="1" Grid.Row="0" Content="+" FontSize="8" VerticalContentAlignment="Top" Click="btPlus_Click" Padding="0"></RepeatButton>
            <RepeatButton Name="btMoins" Grid.Column="1" Grid.Row="1" Content="-" FontSize="8" VerticalContentAlignment="Top" Click="btMoins_Click" Padding="0"></RepeatButton>
     
        </Grid>
    </UserControl>

    ainsi que le code Behind

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
     
    namespace Verification_Lotto
    {
        /// <summary>
        /// Interaction logic for NumericUpDown.xaml
        /// </summary>
        public partial class NumericUpDown : UserControl
        {
     
            Binding bind;
     
            public int Valeur
            {
                get { return (int)GetValue(ValeurProperty); }
                set { SetValue(ValeurProperty, value); }
            }
     
            public static readonly DependencyProperty ValeurProperty =
                DependencyProperty.Register("Valeur", typeof(int), typeof(NumericUpDown), new UIPropertyMetadata(0, onValeurPropertyChanged ));
     
            private static void onValeurPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
            {
     
            }
     
            public NumericUpDown()
            {
                InitializeComponent();
     
                bind = new Binding();
                bind.Source = this;
                bind.Mode = BindingMode.TwoWay;
                bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                bind.Path = new PropertyPath("Valeur");
                this.txtNum.SetBinding(TextBox.TextProperty, bind);
     
            }
     
            private void btPlus_Click(object sender, RoutedEventArgs e)
            {
                if (this.Valeur < 42)
                {
                    this.Valeur = this.Valeur + 1;
                }
                /*txtNum.Text = this.Valeur.ToString();*/
            }
     
            private void btMoins_Click(object sender, RoutedEventArgs e)
            {
                if (this.Valeur > 1)
                {
                    this.Valeur = this.Valeur - 1;
                }
                /*txtNum.Text = this.Valeur.ToString();*/
            }
     
            private void txtNum_PreviewKeyDown(object sender, KeyEventArgs e)
            {
                Key tmp = e.Key;
                if (!(tmp.ToString() == "D1" || tmp.ToString() == "NumPad1" ||
                      tmp.ToString() == "D2" || tmp.ToString() == "NumPad2" ||
                      tmp.ToString() == "D3" || tmp.ToString() == "NumPad3" ||
                      tmp.ToString() == "D4" || tmp.ToString() == "NumPad4" ||
                      tmp.ToString() == "D5" || tmp.ToString() == "NumPad5" ||
                      tmp.ToString() == "D6" || tmp.ToString() == "NumPad6" ||
                      tmp.ToString() == "D7" || tmp.ToString() == "NumPad7" ||
                      tmp.ToString() == "D8" || tmp.ToString() == "NumPad8" ||
                      tmp.ToString() == "D9" || tmp.ToString() == "NumPad9" ||
                      tmp.ToString() == "D0" || tmp.ToString() == "NumPad0" ||
                      tmp.ToString() == "Back" || tmp.ToString() == "Return" || 
                      tmp.ToString() == "Enter" || tmp.ToString() == "Tab"))
                {
                    e.Handled = true;
                }
            }
     
            private void txtNum_LostFocus(object sender, RoutedEventArgs e)
            {
                if (txtNum.Text == "" || txtNum.Text == " ")
                {
                    txtNum.Text = "1";
                }
            }
     
        }
    }

    Merci

  5. #5
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Erf, je comprends mieux ta question et je n'avais pas songé à ce cas-ci. Dans le cas présent, MVVM n'a effectivement que peu d'intérêt et ne ferait qu'obscurcir le code. Et c'est vrai qu'en général, quand on crée des composants bas-niveaux comme des contrôles, on n'utilise pas MVVM. En revanche on fait en sorte que ces composants soient consommables par MVVM en ajoutant une DependencyProperty comme tu l'as fait.

    On va plutôt utiliser MVVM pour des composants de plus haut niveau : fenêtres, pages, datatemplates, contrôles de haut niveau, etc. En fait, typiquement pour tout ce qui représente des objets métiers, par opposition à une NumericTextBox qui n'affiche qu'une valeur.

    Enfin, WPF n'offre pas en standard de moyen de lier une commande à un événement, bien que MVVM light toolkit et d'autres offrent des outils pour ça. Donc, avec le WPF brut, tu ne pourrais pas gérer le PreviewKeyDown.

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Pour moi les principaux points positifs de MVVM sont :

    - Une code plus facile à tester.
    - Un code mieux découper (oui on peut faire aussi du mauvais Design en mvvm).

    Les principaux inconvénient :

    - Tout n'est pas bindable.
    - MVVM n'est pas la solution à tout les problèmes.
    - Il n y as pas une seul façon de faire du MVVM

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    A mon avis je devrais revenir sur le sujet du MVVM pour le fonctionnement principal de mon programme. Mais j'ai plein d'autres question pour avancer dans mon projet, car à part mon UserControl que j'ai créé, je ne suis nul part.

    Puis-je continuer sur ce sujet ou en créer un nouveau?

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 182
    Points : 4 496
    Points
    4 496
    Par défaut
    Si le sujet est différent, c'est mieux d'en créer un nouveau
    Si quelqu'un a le même souci que toi,il lui sera plus facile de trouver la solution si l'intitulé du sujet correspond au sujet

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

Discussions similaires

  1. Question débutant utilité XPATH
    Par Romain_76 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 17/01/2014, 13h38
  2. Réponses: 0
    Dernier message: 18/10/2013, 23h36
  3. [débutant] utilité de webservices
    Par etoile_de_vie dans le forum C#
    Réponses: 1
    Dernier message: 20/02/2008, 10h17
  4. [débutant] Utilité de clone dans Object ?
    Par dabeuliou dans le forum Langage
    Réponses: 10
    Dernier message: 27/02/2007, 12h31
  5. [Débutant] Utilité de l'héritage...?
    Par Sylvester dans le forum Langage
    Réponses: 4
    Dernier message: 14/03/2006, 10h48

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