![](/img/trans.png)
[英]Why does the horizontal scrollbar reset its position when I update the ItemsSource of the DataGrid?
[英]Why does the DataGrid not update when the ItemsSource is changed?
我的 wpf 应用程序中有一个数据网格,我有一个简单的问题。 我有一个通用列表,每次将 object 添加到集合时,我都想将此集合绑定到我的数据网格数据源。 而且我对使用可观察的集合不感兴趣。
关键是我在其他地方使用相同的方法并且效果很好。 但是这次当我按下添加按钮时,添加了 object 并且数据网格正确更新,但是从添加到集合数据网格的第二项不再更新。
这是代码:
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();
}
任何想法?
ItemsSource
始终是相同的,对您的集合的引用,没有变化,没有更新。 你可以在 null 之前把它弄出来:
dgOrderDetail.ItemsSource = null;
dgOrderDetail.ItemsSource = OrderDetailObjects;
或者,您也可以只刷新项目:
dgOrderDetail.ItemsSource = OrderDetailObjects; //Preferably do this somewhere else, not in the add method.
dgOrderDetail.Items.Refresh();
我不认为你真的想在那里调用UpdateLayout
......
(拒绝使用 ObservableCollection 不是一个好主意)
我还发现,只是在做
dgOrderDetails.Items.Refresh();
也将完成相同的行为。
如果您将 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;
我使用 ObservableCollection 作为我的项目集合,而不是在视图 model 调用 CollectionViewSource.GetDefaultView(my_collection).Refresh();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.