41

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

任何的想法 ?

4

4 回答 4

83

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 不是一个好主意

于 2011-08-14T19:20:55.273 回答
18

我还发现,只是在做

dgOrderDetails.Items.Refresh();

也将完成相同的行为。

于 2013-05-17T16:55:30.037 回答
2

如果您将 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;
于 2016-12-15T10:56:44.840 回答
2

我使用 ObservableCollection 作为我的项目集合,而不是在视图模型中调用 CollectionViewSource.GetDefaultView(my_collection).Refresh();

于 2019-07-20T07:57:58.403 回答