2017-03-03 26 views
1

我有一個DataGrid,其中包含有關產品的信息,例如NAME和PRICE, 通過按下DEL鍵(刪除大小寫)可以從DataGrid添加或刪除項目。從ObservableCollection中移除項目的問題,我做錯了

我使用的ObservableCollection作爲DataGrid的來源,它看起來像這樣:

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

也有是在我的窗口,它是保持我的產品的價格和更新所有的時間,當添加的項目和按鈕是增加,當項目被刪除總和減少,東西像那樣..

在我的情況我有我的集合中刪除項目的問題,以及我說我按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刪除它,但我仍然有在這種情況下問題:

比方說,有2項在數據網格,當用戶按下del時,項目將從數據庫中刪除,但方法UpdateTotalAmount();之後將被調用,並在我的收藏將有兩個項目,我會看到incorect總和..

所以也許我沒有做這個UpdateTotalAmount呼籲正確的地點或水木清華那樣,

我也想過這個解決方案:

在存儲過程中,正在刪除項目,我可以從數據庫發回總項目的總和,所以在這種情況下,我不需要循環任何集合做這樣的smth,但我認爲它不是很好的做法?

謝謝你們, 乾杯

+3

FWIW這種東西在使用MVVM時會更容易 – BradleyDotNET

+0

@BradleyDotNET FWIW? –

+1

值得推薦 – BradleyDotNET

回答

1

而不是調用在事件處理的DeleteUpdateTotalAmount方法,您可以處理CollectionChanged事件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(); 
    } 
}; 

然後你根本不需要任何PreviewKeyDown事件處理程序。

+0

@ mm8這是偉大的答案!但你能否將它更詳細地逐行解釋,它的工作原理是完美的,但我想知道真的發生了什麼! –

+2

還有一件事,在這種方式你做到了,我不能問,如果他確定他會刪除該項目?例如MessageBox.Show(「你確定要刪除選定的項目」);在這種情況下,我必須再次查看PreviewKeyDown事件處理程序? –

+0

您可以在事件處理程序中顯示MessageBox,但如果用戶確認,仍然會刪除CollectionChanged事件中的項目。 CollectionChanged是一個事件,當一個項目被添加或從集合中刪除時觸發。 – mm8

相關問題