为啥更改 ItemsSource 时 DataGrid 不更新?
Posted
技术标签:
【中文标题】为啥更改 ItemsSource 时 DataGrid 不更新?【英文标题】:Why does the DataGrid not update when the ItemsSource is changed?为什么更改 ItemsSource 时 DataGrid 不更新? 【发布时间】:2011-10-26 21:47:45 【问题描述】:我的 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();
有什么想法吗?
【问题讨论】:
【参考方案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 并不是一个好主意)
【讨论】:
这是针对这种情况的解决方案,但它只是一个创可贴。真正的解决方案是使用DataBinding
和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】:我使用 ObservableCollection 作为我的项目集合,而不是在视图模型中 调用 CollectionViewSource.GetDefaultView(my_collection).Refresh();
【讨论】:
以上是关于为啥更改 ItemsSource 时 DataGrid 不更新?的主要内容,如果未能解决你的问题,请参考以下文章
当其 ItemsSource 更改时自动刷新 Datagrid
当我第二次设置它的 ItemsSource 时,为啥这个选择器会崩溃?
Xamarin iOS - XAML IsVisible 绑定在 ItemsSource 更改时不会更新
当 ItemsSource 更改 MVVM 时,Combobox SelectedItem 不会更新