Почему DataGrid не обновляется при изменении ItemsSource? - PullRequest
31 голосов
/ 14 августа 2011

У меня есть сетка данных в моем приложении wpf, и у меня есть простая проблема.У меня есть общий список, и я хочу связать эту коллекцию с моим источником данных сетки данных каждый раз, когда объект добавляется в коллекцию.и я не заинтересован в использовании наблюдаемой коллекции.

Дело в том, что я использую тот же метод где-то еще, и это прекрасно работает.но в этот раз, когда я нажимаю кнопку «Добавить», объект добавляется, и сетка данных корректно обновляется, но из второго элемента, добавленного в коллекцию, сетка данных больше не обновляется.

Вот код:

 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();
    }

есть идеи?

Ответы [ 3 ]

63 голосов
/ 14 августа 2011

ItemsSource всегда одно и то же, ссылка на вашу коллекцию, без изменений, без обновлений.Вы могли бы обнулить его раньше:

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

В качестве альтернативы вы также можете просто обновить элементы:

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

Я не думаю, что вы на самом деле хотите позвонить UpdateLayout туда ...

( Отказ от использования ObservableCollection не совсем хорошая идея )

14 голосов
/ 17 мая 2013

Я также обнаружил, что простое выполнение

dgOrderDetails.Items.Refresh();

также приведет к тому же поведению.

1 голос
/ 15 декабря 2016

Если вы связываете ItemSource с отфильтрованным списком, например, с Lambda, он не обновляется. Используйте ICollectionView для решения этой проблемы (комментарий не работает):

//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;
...