我有一个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,但我认为这不是好的做法?
谢谢你们, 干杯
答案 0 :(得分:1)
不是在事件处理程序中调用Delete
和UpdateTotalAmount
方法,而是可以处理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();
}
};
事件处理程序。