web-dev-qa-db-fra.com

Pourquoi le DataGrid ne se met-il pas à jour lorsque le ItemsSource est modifié?

J'ai une grille de données dans mon application wpf et j'ai un problème simple. J'ai une liste générique et je veux lier cette collection à ma source de données de grille de données chaque fois qu'un objet est ajouté à la collection. et je ne suis pas intéressé à utiliser une collection observable.

le fait est que j'utilise la même méthode ailleurs et cela fonctionne très bien. mais cette fois, lorsque j'appuie sur le bouton Ajouter, un objet est ajouté et la grille de données est correctement mise à jour, mais à partir du deuxième élément ajouté à la collection, la grille de données ne se met plus à jour.

Voici le code:

 private void btnAddItem_Click(object sender, RoutedEventArgs e)
    {
        OrderDetailObjects.Add(new OrderDetailObject
        {
            Price = currentitem.Price.Value,
            Quantity = int.Parse(txtQuantity.Text),
            Title = currentitem.DisplayName,
            TotalPrice = currentitem.Price.Value * int.Parse(txtQuantity.Text)
        });

        dgOrderDetail.ItemsSource = OrderDetailObjects;
        dgOrderDetail.UpdateLayout();
    }

une idée ?

31
Pouyan

Le ItemsSource est toujours le même, une référence à votre collection, pas de changement, pas de mise à jour. Vous pouvez l'annuler avant:

dgOrderDetail.ItemsSource = null;
dgOrderDetail.ItemsSource = OrderDetailObjects;

Alternativement, vous pouvez également simplement actualiser les éléments:

dgOrderDetail.ItemsSource = OrderDetailObjects; //Preferably do this somewhere else, not in the add method.
dgOrderDetail.Items.Refresh();

Je ne pense pas que vous vouliez réellement appeler UpdateLayout là ...

(Refuser d'utiliser une ObservableCollection n'est pas tout à fait une bonne idée)

64
H.B.

J'ai aussi découvert que

dgOrderDetails.Items.Refresh();

accomplirait également le même comportement.

14
Matt

Si vous liez ItemSsource à une liste filtrée avec par exemple Lambda ce n'est pas mis à jour. Collectionview utilisée pour résoudre ce problème (le commentaire ne fonctionne pas):

//WindowMain.tvTemplateSolutions.ItemsSource = this.Context.Solutions.Local.Where(obj=>obj.IsTemplate); // templates
ICollectionView viewTemplateSolution = CollectionViewSource.GetDefaultView(this.Context.Solutions.Local);
viewTemplateSolution.SortDescriptions.Clear();
viewTemplateSolution.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
viewTemplateSolution.Filter = obj =>
{
   Solution solution = (Solution) obj;
   return solution.IsTemplate;
};
WindowMain.tvTemplateSolutions.ItemsSource = viewTemplateSolution;
1
Suplanus

j'utilise ObservableCollection comme ma collection d'articles et que dans le modèle de vue, appelez CollectionViewSource.GetDefaultView (my_collection) .Refresh ();

0
user742808