none
Rafraichire mon datagrid(wpf EF

    Discussion générale

  • Bonjour,

    Bon voila mon problème je suis nouveau dans wpf et mvm et donc j'essais de maîtriser les bases en faisant une petite application de gestion de stock en utilisant Entity framework database first.

    Apres un ajout ou une suppression mon datagrid n'est pas automatiquement mis à jour, j'ai lu plein de truc sur des forum mais rien à faire.

    J’espérerais que quelqu'un puisse m'aider à régler mon problème.

    voici mon code

    ArticleViewModel

    Class ArticleViewModel
    {
    private GStockEntities context;
    
    public ArticleViewModel()
            {
                context = new GStockEntities();
            }
    
    public ObservableCollection<ArticleAnonymous> GetAllArticle()
            {
                ObservableCollection<ArticleAnonymous> Article = new ObservableCollection<ArticleAnonymous>();
    
                try
                {
                    var query = (from a in context.articles
                                 join c in context.categories on a.id_categorie equals c.id_categorie
                                 select  new ArticleAnonymous
                                 {
                                     id_article = a.id_article,
                                     nom = a.nom,
                                     nom_categorie = c.nom_categorie,
                                     quantite = a.quantite,
                                     prix_achat = a.prix_achat,
                                     prix_vente = a.prix_vente
                                 }).ToList();
                    Article.Clear();
    
                    foreach (var item in query)
                    {
                        Article.Add(item);
                    }
                }
                catch (Exception)
                {
    
                    throw;
                }
    
                return Article;
            }
    
    public ObservableCollection<ArticleAnonymous> Article
            {
                get
                {
                    return this.GetAllArticle();
                }
                set
                {
                    Set(ref _Article, value);
                }
            }
    }

    ViewModelBase

    class ViewModelBase : INotifyPropertyChanged, INotifyDataErrorInfo
        {
            public ViewModelBase()
            {
            }
    
    
            #region INotifyPropertyChanged
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void Notify([CallerMemberName]string propertyName = null)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
    
            }
    
            protected bool Set<TProperty>(ref TProperty attrib, TProperty value, [CallerMemberName]string propertyName = null)
            {
                if (!object.Equals(attrib, value))
                {
                    OnPropertyChanging(propertyName, attrib, value);
                    attrib = value;
                    Notify(propertyName);
                    OnPropertyChanged(propertyName);
                    return true;
                }
                return false;
            }
    
            protected virtual void OnPropertyChanged(string propertyName) { }
    
            protected virtual void OnPropertyChanging(string propertyName, object oldValue, object newValue) { }
            #endregion
    
    }

    ArticleView

    <DockPanel x:Name="dokpane" DataContext="{DynamicResource viewModel}">
    
    <DataGrid DockPanel.Dock="Right" AutoGenerateColumns="False" Name="ArtDatagrid" ItemsSource="{Binding Article}" 
                      SelectedItem="{Binding SelectedArticle}"  CanUserAddRows="True"> 
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Id" Binding="{Binding id_article}" Width="*"/>
                    <DataGridTextColumn Header="Nom" Binding="{Binding nom}" Width="*"/>
                    <DataGridTextColumn Header="Nom de la categorie" Binding="{Binding nom_categorie}" Width="*"/>
                    <DataGridTextColumn Header="QT" Binding="{Binding quantite}" Width="*"/>
                    <DataGridTextColumn Header="Prix d'achat" Binding="{Binding prix_achat}" Width="*"/>
                    <DataGridTextColumn Header="prix de vente" Binding="{Binding prix_vente}" Width="*"/>
                </DataGrid.Columns>
            </DataGrid>
    </DockPanel>

    Merci d'avance.

    lundi 6 juin 2016 09:34

Toutes les réponses

  • Bonjour Loïc Parker AMUZU,

    Je me suis basé sur vos sources pour effectuer un test, je suppose qu'Entity Framework manipule des listes de son côté, c'est pour cela que vous n'êtes pas notifié du changement. J'ai créer une méthode ou je simule l'ajoute d'un article dans votre objet context :

    public void add()
            {
                context.Add(new ArticleAnonymous() { id_article = 5, nom = "Article 5", nom_categorie = "jardin", prix_achat = 20, prix_vente = 5, quantite = 20 });
    
                    Article = new ObservableCollection<ArticleAnonymous>(context);
            }

    Comment vous le voyez, une solution est de repasser le context pour initialiser une nouvelle observable collection qui prend en compte la nouvelle liste de données.

    lundi 6 juin 2016 11:57
  • Merci pour ta réponse mais aucun changement.

    voici la methode qui me permet de faire l'ajout

    private void Add()
            {
                article Article = new article();
                Article.id_article = id;
                Article.nom = nom_Article;
                Article.id_categorie = GetIdCategoriByName(nom_categorie);
                Article.quantite = (int)qt;
                Article.prix_achat = (decimal)prix_achat;
                Article.prix_vente = (decimal)prix_vente;
    
                context.articles.Add(Article);
                context.SaveChanges();
            }

    lundi 6 juin 2016 12:51
  • Article = new ObservableCollection<ArticleAnonymous>(context.articles);
    après SaveChanges ne fait rien du tout ?
    lundi 6 juin 2016 13:29
  • Sa marche

    Merci 

    pour les futures personnes qui aurront le meme probleme

    j'ai refais la meme chose mais avec une autre table de ma bdd.

    Voici le code

    CategorieViewModel

    class CategorieViewModel : ViewModelBase
        {
            private GStockEntities context;
            private ObservableCollection<categorie> _Categorie = new ObservableCollection<categorie>();
    
            public CategorieViewModel()
            {
                context = new GStockEntities();
            }
    
            #region CRUD function
    
            public ObservableCollection<categorie> GetAllCategorie()
            {
                ObservableCollection<categorie> Categorie = new ObservableCollection<categorie>();
    
                try
                {
                    var query = (from c in context.categories
                                select c).ToList();
                    Categorie.Clear();
    
                    foreach (var item in query)
                    {
                        Categorie.Add(item);
                    }
                }
                catch (Exception)
                {
    
                    throw;
                }
    
                return Categorie;
            }
    
            private void Add()
            {
                categorie Categorie = new categorie();
                Categorie.id_categorie = SelectedCatgorie.id_categorie;
                Categorie.nom_categorie = SelectedCatgorie.nom_categorie;
    
                context.categories.Add(Categorie);
                context.SaveChanges();
    
                Categories = new ObservableCollection<categorie>(context.categories);
    
            }
    
            public ObservableCollection<categorie> Categories
            {
                get
                {
                    return this.GetAllCategorie();
                }
                set
                {
                    Set(ref _Categorie, value);
                }
            }
    }

    CategorieView

    <DockPanel x:Name="dokpane" DataContext="{StaticResource catViewModel}">
            <DataGrid DockPanel.Dock="Right" AutoGenerateColumns="False" Name="CatDatagrid" ItemsSource="{Binding Categories}" SelectedItem="{Binding SelectedCatgorie, Source={StaticResource catViewModel}}" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Id" Binding="{Binding id_categorie}" />
                    <DataGridTextColumn Header="Nom" Binding="{Binding nom_categorie}"/>
                </DataGrid.Columns>
            </DataGrid>
        </DockPanel>

    lundi 6 juin 2016 13:49