当ItemsSource改变时,为什么DataGrid没有更新?

45

我在我的WPF应用程序中有一个数据网格,遇到了一个简单的问题。我有一个通用列表,并且每当向该列表添加对象时,我想将此集合绑定到我的datagrid数据源,并且我不想使用observable collection。

问题在于,我在其他地方使用相同的方法,并且那里运作良好。但是这一次,当我按下添加按钮并添加一个对象后,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();
    }
任何想法?
4个回答

90

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


4
这是该案例的一种解决方案,但只是权宜之计。真正的解决方案应该使用“数据绑定”和“可观察集合”。这方面有很多示例。 - RoelF

21

我还发现只要做

dgOrderDetails.Items.Refresh();

也可以实现相同的行为。


2
我使用ObservableCollection作为我的项集合,然后在视图模型中调用CollectionViewSource.GetDefaultView(my_collection).Refresh()。最初的回答。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接