Почему 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();
}
любая идея?
Ответы
Ответ 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();