从ObservableCollection中删除项目的问题,我做错了

时间:2017-03-03 18:43:55

标签: c# wpf collections datagrid

我有一个DataGrid,其中包含有关产品的信息,例如NAME和PRICE, 通过按DEL键向下删除项目(删除案例),可以在DataGrid中添加或删除项目。

我使用ObservableCollection作为DataGrid源,它看起来像这样:

ObservableCollection<ProductTemporary> result = ProductsTempController.Instance.SelectAll();

我的窗口上还有一个按钮,它保持我的产品价格的总和一直保持更新,当项目被添加时总和增加,当项目被删除时总和减少和类似的东西..

在我的情况下,我遇到了从我的Collection中删除项目的问题,好吧,正如我所说的那样,按DEL键这样做,所以这是我的代码:

if (e.Key == Key.Delete)
{
    if (dataGridProducts.SelectedItem != null)
    {
        ProductTemporary tempItem = (ProductTemporary)dataGridProducts.SelectedItem;
        ProductTemporaryController.Instance.Delete(tempItem.Id);

        UpdateTotalAmount();
    }
}


public void UpdateTotalAmount()
{
    double sum = 0;
    foreach (var item in result)
    {
        sum += Convert.ToDouble(item.TotalAmount);
    }
    btnTotal.Content = string.Format("{0:0.00}", sum) + " " + EUR;
}

有可能看到,首先我要从数据库中删除项目,ObservableCollection会小心地将其从UI中删除,但在这种情况下我仍然遇到问题:

假设datagrid上有2个项目,当用户按del时,项目将从数据库中删除,但方法是UpdateTotalAmount();将在此之后立即调用,在我的收藏中将有两个项目,我将看到incorect总和..

所以我可能不会在正确的地方调用这个UpdateTotalAmount,或者像那样调用它,

我也考虑过这个解决方案:

在删除项目的存储过程中,我可以从数据库发送总项目的总和,所以在这种情况下我不需要循环任何集合来做那样的smth,但我认为这不是好的做法?

谢谢你们, 干杯

1 个答案:

答案 0 :(得分:1)

不是在事件处理程序中调用DeleteUpdateTotalAmount方法,而是可以处理CollectionChanged的{​​{1}}事件,并在数据库中删除该项目从集合中删除:

ObservableCollection

然后你根本不需要任何ObservableCollection<ProductTemporary> result = new ObservableCollection<ProductTemporary>();//ProductsTempController.Instance.SelectAll(); result.CollectionChanged += (ss, ee) => { if(ee.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove && ee.OldItems !=null && ee.OldItems.Count > 0) { ProductTemporary removedItem = ee.OldItems[0] as ProductTemporary; ProductTemporaryController.Instance.Delete(removedItem.Id); UpdateTotalAmount(); } }; 事件处理程序。