C# 从ObservableCollection中删除项目时出现问题,我做错了什么

C# 从ObservableCollection中删除项目时出现问题,我做错了什么,c#,wpf,collections,datagrid,C#,Wpf,Collections,Datagrid,我有一个数据网格,它包含产品的信息,比如名称和价格, 通过按下DEL键(删除案例),可以从DataGrid中添加或删除项目 我使用ObservaleCollection作为数据网格源,它如下所示: ObservableCollection<ProductTemporary> result = ProductsTempController.Instance.SelectAll(); 可以看出,首先我要从数据库中删除项,ObservableCollection会注意从UI中删除它,但在

我有一个数据网格,它包含产品的信息,比如名称和价格, 通过按下DEL键(删除案例),可以从DataGrid中添加或删除项目

我使用ObservaleCollection作为数据网格源,它如下所示:

ObservableCollection<ProductTemporary> result = ProductsTempController.Instance.SelectAll();
可以看出,首先我要从数据库中删除项,ObservableCollection会注意从UI中删除它,但在这种情况下我仍然有问题:

假设datagrid上有2个项,当用户按del时,该项将从数据库中删除,但方法UpdateTotalAmount();在我的收藏中将有两个项目,我将看到不正确的总数

所以我可能没有在正确的地方或类似的地方做这个更新

我还想到了这个解决方案:

在删除项的存储过程中,我可以从数据库发回所有项的总和,所以在这种情况下,我不需要循环任何集合来执行类似的smth,但我认为这不是一个好的做法

谢谢各位,
Cheers

您可以在事件处理程序中处理
ObservableCollection
CollectionChanged
事件,而不是调用
Delete
UpdateTotalAmount
方法,并在从集合中移除项目时从数据库中移除该项目:

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();
    }
};
ObservableCollection结果=新的ObservableCollection()//ProductsTempController.Instance.SelectAll();
result.CollectionChanged+=(ss,ee)=>
{
如果(ee.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Remove
&&ee.OldItems!=null&&ee.OldItems.Count>0)
{
ProductTemporary removedItem=ee.OldItems[0]作为ProductTemporary;
ProductTemporaryController.Instance.Delete(removedItem.Id);
UpdateTotalAmount();
}
};

那么你就根本不需要任何
PreviewKeyDown
事件处理程序了。

FWIW这种东西在使用MVVM@BradleyDotNETFWIW?为什么Worth@Roxy'Pro,从源对象而不是控件中删除选定项。即使将更新control@Roxy'专业人士,显然选择会改变,您正在删除item@mm8这是一个很好的答案!但你能逐行详细解释一下吗?它很好用,但我想知道到底发生了什么!还有一件事,通过这种方式,我不能问用户是否确定他会删除该项目?例如MessageBox.Show(“您确定要删除所选项目吗”);在这种情况下,我必须再次查找PreviewKeyDown事件处理程序?您可以在事件处理程序中显示MessageBox,但如果用户确认,仍然可以删除CollectionChanged事件中的项。CollectionChanged是一个事件,每当从集合中添加或删除项目时都会触发。如果我只想在PreviewKeyDown事件处理程序中删除项目,当用户按Del键时,我是否应该将发布的代码移动到Del键Down事件处理程序中?还是怎样我的意思是我想控制收藏何时更改(仅在键上。向下删除)?如果只想在按Delete键时更改某些内容,处理PreviewKeyDown事件听起来是个好主意。
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();
    }
};