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 :

MVVM - Binding datagrid.


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 62
    Points : 61
    Points
    61
    Par défaut MVVM - Binding datagrid.
    Bonjour,

    Je travaille sur une application MVVM et je coince sur la population d'un datagrid.

    Dans ma classe ViewModel j'ai bien déclaré ma propriété
    public ObservableCollection<Product> lstProduct
    {
    get { return SingletonEntities.GetInstance().dc.Products.ToObservableCollection(); }
    }

    private Product _SelectedProduct;
    public Product SelectedProduct
    {
    get { return _SelectedProduct;}
    set
    {
    _SelectedProduct = value; RaisePropertyChanged(() => SelectedProduct );
    }
    }
    J'ai un UserControl dans lequel j'ai un combobox correctement remplis.
    J'ai réussis à faire le binding d'un textbox en fonction du choix fait dans le combobox, par contre je n'arrive pas à remplir mon datagrid en fonction du même choix fait dans la combobox.
    Normalement la données que je trouve dans mon textbox devrait être la même que celle de mon datagrid mais celui-ci ne change pas .

    <Grid Grid.Row="0">
    <ComboBox Margin="6" ItemsSource="{Binding Path=lstProduct}"
    SelectedItem = "{Binding Path=SelectedProduct}" DisplayMemberPath="ProductName"/>
    </Grid>
    <Grid Grid.Row="0" Grid.Column="1">
    <TextBox Margin="6" Text="{Binding SelectedProduct.ProductID}"/>
    </Grid>
    <DataGrid Margin="6" Name="dgStockProductHistory" ItemsSource="{Binding Path=SelectedProduct}" IsReadOnly="True" AutoGenerateColumns="false" SelectionMode="Single">
    <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding ProductID}" Width="*" Header="ID Produit"/>
    </DataGrid.Columns>
    </DataGrid>
    </Grid>
    il y a surement une astuce que je n'ai pas encore saisis.

    Merci d'avance.

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour MoThA

    il y a surement une astuce que je n'ai pas encore saisis.
    ComboBox tu le traites correctement puisque tu lui affectes une liste de produits(lstProducts) dans son ItemsSource...

    Le dgv tu le fais patienter comme un minable ....alors il fat le dos rond...
    Car un dgv etant un ItemsControl,il attend un ObservableCollection dans son ItemsSource et non un objet de type Product ....
    ton code du viewmodel doit donc comporter un list SelectedProducts des produits selectionnes qui contient l'unique SelectedProduct....
    code du VM:
    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
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
    using System.Collections.ObjectModel;
    namespace WpfDataGridWithDataTable
    {
        public class ProductVM : INotifyPropertyChanged
        {
            private Products _lstProduct = new Products();
            public Products lstProduct
            {
                get { return _lstProduct; }
                set
                {
                    _lstProduct = value;
                    RaisePropertyChanged("lstProduct");
                }
            }
     
            private Product _SelectedProduct = null;
            public Product SelectedProduct
            {
                get { return _SelectedProduct; }
                set
                {
                    _SelectedProduct = value  ;
                    // recree le list et lui ajoute le produit selectionne 
                    SelectedProducts=new ObservableCollection<Product> ();
                    SelectedProducts.Add(_SelectedProduct);
                    RaisePropertyChanged("SelectedProduct");
                }
     
            }
            private ObservableCollection<Product> _SelectedProducts = null ;
            public ObservableCollection<Product> SelectedProducts
            {
                get { return _SelectedProducts; }
                set
                {
                    _SelectedProducts = value;
                    RaisePropertyChanged("SelectedProducts");
                }
     
            }
     
     
     
            #region INotifyPropertyChanged Membres
     
            public event PropertyChangedEventHandler PropertyChanged;
            private void RaisePropertyChanged(string propName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propName));
                }
            }
            #endregion
        }
    }
    et dans le xaml tout est simple:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     <Grid 
            Grid.Row="0">
                <ComboBox 
                    x:Name="cbo"
                    Margin="6" 
                    ItemsSource="{Binding  Path=lstProduct}" 
                    SelectedItem = "{Binding Path=SelectedProduct}" 
                    DisplayMemberPath="ProductName"
                    SelectionChanged="cbo_SelectionChanged"/>
            </Grid>
            <Grid 
                Grid.Row="0" 
                Grid.Column="1">
                <TextBox 
                    Margin="6" 
                    Text="{Binding SelectedProduct.ProductID}"/>
            </Grid>
            <DataGrid 
                Grid.Row="1" 
                Margin="6" Name="dgStockProductHistory"
                ItemsSource="{Binding Path=SelectedProducts}" 
                AutoGenerateColumns="False"   
                SelectionMode="Single">
                <DataGrid.Columns>
                    <DataGridTextColumn 
                        Binding="{Binding ProductID}" 
                        Width="*" Header="ID Produit"/>
                </DataGrid.Columns>
            </DataGrid>
           </Grid>
    </Window>
    bon code...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 436
    Points : 963
    Points
    963
    Par défaut
    +1 avec MABROUKI sur ton type d'objets passé en itemsSource.

    Je rajouterai ceci ;
    Fait très attention avec les property readonly qui retournent uneListe.Where(...).TOLIST() car on a vite des problèmes avec les variables passés par référence côté viewModel.

    Ensuite, utiliser un datagrid pour afficher un seul élément, ça me fait bizarre.
    "S'adapter, c'est vaincre" - Cellendhyll de Cortavar

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Retour de vacances, je vais regarder ça.
    @Kikuts, je désire retourner plus d'un élément sinon comme tu dis, l'utilisation d'un datagrid serait plus qu'inadéquat.

    Merci d'avance.

Discussions similaires

  1. [MVVM] Binding à un ViewModel depuis le code-behind
    Par Gigi070 dans le forum Windows Presentation Foundation
    Réponses: 23
    Dernier message: 29/03/2010, 17h46
  2. MVVM + Binding + Validation de données
    Par goast dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 27/07/2009, 15h55
  3. MVVM et Datagrid : definir par binding la visibilité des colonnes
    Par zax-tfh dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 19/05/2009, 15h56
  4. [Binding] DataGrid incluant une combobox
    Par Harry_polin dans le forum Windows Forms
    Réponses: 9
    Dernier message: 11/12/2008, 16h05
  5. [VB.Net -> C#][VS2003]Binding DataGrid
    Par Nico-xs dans le forum Windows Forms
    Réponses: 1
    Dernier message: 07/07/2006, 16h17

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