Подтвердить что ты не робот

Почему DataGrid не обновляется при изменении ItemsSource?

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

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

Вот код:

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

любая идея?

4b9b3361

Ответ 1

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 - не совсем хорошая идея)

Ответ 2

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

dgOrderDetails.Items.Refresh();

также выполнит то же поведение.

Ответ 3

Если вы привязываете 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;

Ответ 4

У меня точно такая же проблема. Я хотел обновить свой источник данных datagrid в коде позади, и ничего не обновлено. На самом деле, это было потому, что я объявлял itemssource в datagrid в файле xaml тоже. Это работало на моем компьютере-разработчике, но не на сервере IIS. Если вы не объявляете itemssource на datagrid в xaml, но только в коде позади (при загрузке_данных и фильтрации или добавлении), он отлично работает.

С уважением.

Ответ 5

я использую ObservableCollection в качестве своей коллекции элементов, а затем в вызове модели представления CollectionViewSource.GetDefaultView(my_collection).Refresh();