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 :

Databinding avec MVVM


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 101
    Par défaut Databinding avec MVVM
    Bonjour,

    J’essaye d’appliquer le patern MVVM mais je galère un peu. J’ai une ObservableCollection avec date_depense, montant_depense et observation_depense. Dans ma vue, je désire avoir une combobox avec la liste des années de date_depense (groupée) et une datagrid avec les colonnes (date_depense, montant_depense et observation_depense). Je voudrai sélectionner par exemple 2010 dans ma combobox et afficher toutes les dépenses de 2010 dans ma datagrid. Je suis passé par une collectionview mais je n’arrive pas à avoir de résultat.

    Merci pour votre aide

    Laurent

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

    Je pense qu'il faudrait que tu montres un peu ton code pour voir ou se situe l'erreur.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 101
    Par défaut
    Bonjour Hathortos,

    J'ai cree dans mon modele 3 classes :
    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
        public class Annee
        {
            public int A_Annee { get; set; }
     
        public class Depense
        {
            public Int32 B_Numero { get; set; }
            public Int32 B_Montant { get; set; }
            public DateTime B_Date { get; set; }
            public string B_Observation { get; set; }
            public int B_Annee { get; set; }
        }
        public class Database
        {
            private List<Depense> depenses;
            private List<Annee> annees; 
     
            public Database()
            {
                this.depenses = new List<Depense>();
                this.Depenses.Add(new Depense { B_Numero = 1, B_Montant = 1964, B_Date = DateTime.ParseExact("07/06/2011", "dd/MM/yyyy", null), B_Observation = "Mon premier MVVM", B_Annee = 2011 });
                this.Depenses.Add(new Depense { B_Numero = 2, B_Montant = 1965, B_Date = DateTime.ParseExact("07/06/2010", "dd/MM/yyyy", null), B_Observation = "Mon deuxieme MVVM", B_Annee = 2010 });
                this.Depenses.Add(new Depense { B_Numero = 3, B_Montant = 1966, B_Date = DateTime.ParseExact("07/07/2011", "dd/MM/yyyy", null), B_Observation = "Mon troisième MVVM", B_Annee = 2011 });
     
                this.annees = new List<Annee>();
                this.Annees.Add(new Annee { A_Annee = 2010 });
                this.Annees.Add(new Annee { A_Annee = 2011 });
            }
     
            public List<Depense> Depenses
            {
                get { return this.depenses; }
            }
     
            public List<Annee> Annees
            {
                get { return this.annees; }
            }
    }
        }

    Dans mon VueModele j'ai crée aussi 4 classes :
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
     
       public abstract class VM_Base : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
     
            public void VerifyPropertyName(string propertyName)
            {
                if (TypeDescriptor.GetProperties(this)[propertyName] == null)
                {
                    MessageBox.Show("Invalid property name: " + propertyName);
                }
            }
     
            protected virtual void OnPropertyChanged(string propertyName)
            {
                this.VerifyPropertyName(propertyName);
     
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
     
        public class VM_Database : VM_Base 
        {
           private Database db;
           private ObservableCollection<VM_Depense> OC_Depenses;
           private ObservableCollection<VM_Annee> OC_Annees;
           private ICollectionView CV_Database;
     
           public VM_Database(Database db)
            {
                this.db = db;
                this.OC_Depenses = new ObservableCollection<VM_Depense>();
                foreach (Depense depense in this.db.Depenses)
                {
                    this.OC_Depenses.Add(new VM_Depense(depense));
                }
     
                this.OC_Annees = new ObservableCollection<VM_Annee>();
                foreach (Annee annee in this.db.Annees)
                {
                    this.OC_Annees.Add(new VM_Annee(annee));
                }
     
     
                this.CV_Database = CollectionViewSource.GetDefaultView(this.OC_Annees);
                if (this.CV_Database == null) throw new NullReferenceException("collectionView");
                CV_Database.SortDescriptions.Add(new SortDescription("A_Annee", ListSortDirection.Descending));
     
                this.CV_Database = CollectionViewSource.GetDefaultView(this.OC_Depenses);
                if (this.CV_Database == null) throw new NullReferenceException("collectionView");
                CV_Database.SortDescriptions.Add(new SortDescription("B_Annee", ListSortDirection.Descending));
     
            }
     
           public ObservableCollection<VM_Depense> Depenses
           {
               get { return this.OC_Depenses; }
           }
     
           public ObservableCollection<VM_Annee> Annees
           {
               get { return this.OC_Annees; }
           }
     
           private void OnCollectionViewCurrentChanged(object sender, EventArgs e)
           {
               OnPropertyChanged("SelectedAnnee");
           }
     
           public VM_Annee SelectedAnnee
           {
               get { return this.CV_Database.CurrentItem as VM_Annee; }
           }
     
        public class VM_Annee : VM_Base 
        {
            private Annee annee;
     
            public Annee Annee
            {
                get { return this.annee; }
                set{}
             }
     
            public int A_Annee
            {
                get
                {
                    return this.annee.A_Annee;  
                }
                set
                {
                    this.annee.A_Annee = value;
                    OnPropertyChanged("A_Annee");
                }
            }
     
     
            public VM_Annee(Annee annee)
            {
                if (annee == null) throw new NullReferenceException("annee");
                this.annee = annee;
            }
        }
     
       public class VM_Depense : VM_Base
        {
            private Depense depense;
     
            public Depense Depense
            {
                get { return this.depense; }
                set{}
             }
     
     
            public Int32 B_Montant
            {
                get
                {
                    return this.depense.B_Montant;
                }
                set
                {
                    this.depense.B_Montant = value;
                    OnPropertyChanged("B_Montant");
                }
            }
     
            public string B_Observation
            {
                get
                {
                    return this.depense.B_Observation;
                }
                set
                {
                    this.depense.B_Observation = value;
                    OnPropertyChanged("B_Observation");
                }
            }
     
     
            public DateTime B_Date
            {
                get
                {
                    return this.depense.B_Date;
                }
                set
                {
                    this.depense.B_Date = value;
                    OnPropertyChanged("B_Date");
                }
            }
     
            public int B_Annee
            {
                get
                {
                    return this.depense.B_Annee;  
                }
                set
                {
                    this.depense.B_Annee = value;
                    OnPropertyChanged("B_Annee");
                }
            }
     
     
            public VM_Depense(Depense depense)
            {
                if (depense == null) throw new NullReferenceException("person");
                this.depense = depense;
            }
        }

    Je te donne auusi le xaml :

    Code xml : 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
     
              <StackPanel  Margin="0,30,0,0"  Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                    <StackPanel Margin="-20,0,0,0" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                        <Label Content="Année" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Right" Width="70 " />
                        <ComboBox x:Name="CB_BAnnee" ItemsSource="{Binding Annees}" DisplayMemberPath="A_Annee" VerticalAlignment="Center" FontSize="13" Margin="10,0,0,0" HorizontalContentAlignment="Center" Width="70" FontStretch="Normal" IsEnabled="True" IsSynchronizedWithCurrentItem="True" DataContext="{Binding}">
                         </ComboBox>
                    </StackPanel>
                </StackPanel>
     
                            <DataGrid ItemsSource="{Binding Depenses}"  AutoGenerateColumns="False" Width="410" Height="200" x:Name="DG_Paiement" Margin="2,2,2,0" CanUserAddRows="True" CanUserDeleteRows="True" FontFamily="Arial" FontSize="13" SelectionMode="Single" IsReadOnly="True" IsEnabled="True" HorizontalScrollBarVisibility="Disabled" AlternatingRowBackground="#FF454545" HorizontalAlignment="Right" HorizontalContentAlignment="Center">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Date" Width="100" FontFamily="Arial" Binding="{Binding B_Date}"/>
                                    <DataGridTextColumn Header="Montant" Width="100" FontFamily="Arial" Binding="{Binding B_Montant}"/>
                                    <DataGridTextColumn Header="Observation" Width="240" FontFamily="Arial" Binding="{Binding B_Observation}"/>
                            </DataGrid.Columns>
                        </DataGrid>

    Et la fenetre principale :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
           public Principal()
            {
                InitializeComponent();
     
                Database db = new Database();
                VM_Database vmd = new VM_Database(db);
     
                this.Depense.DataContext = vmd;

    Je me suis inspiré de la doc de Jérémy Alies (Comment tirer efficacement parti des avantages de WPF).

    Question : faut-il creer la classe année pour avoir les années distinctes dans la combobox ? moi j'aurai voulu alimenter la combobox par la propriété B_Annee de la classe depense. Le probleme il m'affiche 3 rows au lieu de 2 (2010 et 2011). Et après je voudrai que les rows s'affichent dans la datagrid en fonction du combobox.

    J'espère que j'ai été clair.
    Merci pour ton aide

    Laurent

  4. #4
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Voila une version des VM qui marche (chez moi ):
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
     
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Data;
    using System.Linq;
     
    public abstract class VM_Base : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
     
        public void VerifyPropertyName(string propertyName)
        {
            if (TypeDescriptor.GetProperties(this)[propertyName] == null)
            {
                MessageBox.Show("Invalid property name: " + propertyName);
            }
        }
     
        protected virtual void OnPropertyChanged(string propertyName)
        {
            this.VerifyPropertyName(propertyName);
     
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
     
    public class VM_Database : VM_Base
    {
        private Annee.Database db;
        private ObservableCollection<VM_Depense> OC_Depenses;
        private ObservableCollection<VM_Annee> OC_Annees;
        private ICollectionView CV_Database;
     
        private ICollectionView CV_Annees;
     
        public VM_Database(Annee.Database db)
        {
            this.db = db;
            this.OC_Depenses = new ObservableCollection<VM_Depense>();
            foreach (Annee.Depense depense in this.db.Depenses)
            {
                this.OC_Depenses.Add(new VM_Depense(depense));
            }
     
            this.OC_Annees = new ObservableCollection<VM_Annee>();
            foreach (Annee annee in this.db.Annees)
            {
                this.OC_Annees.Add(new VM_Annee(annee));
            }
     
     
            this.CV_Annees = CollectionViewSource.GetDefaultView(this.OC_Annees);
            if (this.CV_Annees == null) throw new NullReferenceException("collectionView");
            CV_Annees.SortDescriptions.Add(new SortDescription("A_Annee", ListSortDirection.Descending));
            CV_Annees.CurrentChanged += (s, e) =>
                                            {
                                                OnPropertyChanged("Depenses");
                                            };
     
            //this.CV_Database = CollectionViewSource.GetDefaultView(this.OC_Depenses);
            //if (this.CV_Database == null) throw new NullReferenceException("collectionView");
            //CV_Database.SortDescriptions.Add(new SortDescription("B_Annee", ListSortDirection.Descending));
     
        }
     
        void CV_Annees_CurrentChanged(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }
     
        void OC_Annees_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            throw new NotImplementedException();
        }
     
        public IEnumerable<VM_Depense> Depenses
        {
            get { return this.OC_Depenses.Where(d => d.B_Date.Year == SelectedAnnee); }
        }
     
        public ICollectionView Annees
        {
            get { return this.CV_Annees; }
        }
     
        private void OnCollectionViewCurrentChanged(object sender, EventArgs e)
        {
            OnPropertyChanged("SelectedAnnee");
        }
     
        public int SelectedAnnee
        {
            get
            {
                var selectedyear = Annees.CurrentItem as VM_Annee;
     
                return selectedyear != null ? selectedyear.A_Annee : -1;
            }
        }
     
        public class VM_Annee : VM_Base
        {
            private Annee annee;
     
            public Annee Annee
            {
                get { return this.annee; }
                set { }
            }
     
            public int A_Annee
            {
                get
                {
                    return this.annee.A_Annee;
                }
                set
                {
                    this.annee.A_Annee = value;
                    OnPropertyChanged("A_Annee");
                }
            }
     
     
            public VM_Annee(Annee annee)
            {
                if (annee == null) throw new NullReferenceException("annee");
                this.annee = annee;
            }
        }
     
        public class VM_Depense : VM_Base
        {
            private Annee.Depense depense;
     
            public Annee.Depense Depense
            {
                get { return this.depense; }
                set { }
            }
     
     
            public Int32 B_Montant
            {
                get
                {
                    return this.depense.B_Montant;
                }
                set
                {
                    this.depense.B_Montant = value;
                    OnPropertyChanged("B_Montant");
                }
            }
     
            public string B_Observation
            {
                get
                {
                    return this.depense.B_Observation;
                }
                set
                {
                    this.depense.B_Observation = value;
                    OnPropertyChanged("B_Observation");
                }
            }
     
     
            public DateTime B_Date
            {
                get
                {
                    return this.depense.B_Date;
                }
                set
                {
                    this.depense.B_Date = value;
                    OnPropertyChanged("B_Date");
                }
            }
     
            public int B_Annee
            {
                get
                {
                    return this.depense.B_Annee;
                }
                set
                {
                    this.depense.B_Annee = value;
                    OnPropertyChanged("B_Annee");
                }
            }
     
     
            public VM_Depense(Annee.Depense depense)
            {
                if (depense == null) throw new NullReferenceException("person");
                this.depense = depense;
            }
        }
    }

    C'est fait en 2min, il y a peut-être des bugs, et certainement des optimisations possibles, mais ça va te donner une voie pour faire ce que tu veux.
    Le problème était que tu avais des vues sur tes collections, mais tu n'attachais rien à l'évènement CurrentChanged

    En gros, j'ai changé les propriétes années et depenses. Et rajouté une lambda expression pour l'event currentchanged sur la view année.

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 101
    Par défaut
    Bonjour Olivier,

    C’est excellent ca marche super , je galérai depuis quelques jours .

    Petite question : est-ce qu'il serait possible de faire la même chose en supprimant la classe Annee et de remplir la combobox à partir de B_Annee de depense.cs ?

    Encore merci de ton aide

    Laurent

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

Discussions similaires

  1. [débutant] DataBind avec une textbox
    Par Knightrider76 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/07/2007, 19h01
  2. [Visual Web] [VisualWeb] DataBinding avec Tomcat
    Par balmeyer dans le forum NetBeans
    Réponses: 14
    Dernier message: 02/05/2007, 15h04
  3. Réponses: 2
    Dernier message: 21/02/2007, 11h22
  4. DataBinding avec un Dictionnary
    Par Matthieu MEZIL dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/02/2007, 18h23
  5. [C# .NET 2.0] Databinding avec ArrayList
    Par Sylvain James dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2006, 10h57

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