为什么在更改ItemsSource时DataGrid不会更新?

时间:2011-08-14 19:13:02

标签: c# wpf data-binding datagrid itemsource

我的wpf应用程序中有一个datagrid,我有一个简单的问题。我有一个通用列表,我希望每次将对象添加到集合时将此集合绑定到我的数据网格数据源。我对使用可观察的集合不感兴趣。

关键是我在其他地方使用相同的方法,并且工作正常。但是这次当我按下Add按钮时,会添加一个对象并且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 个答案:

答案 0 :(得分:61)

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

答案 1 :(得分:14)

我还发现只是在做

dgOrderDetails.Items.Refresh();

也会完成相同的行为。

答案 2 :(得分:1)

如果将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;

答案 3 :(得分:0)

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