2013-03-29 34 views
2

我有以下接口:ObservableCollection.CollectionChanged未擊發

DataGrid

當一個項目被添加到DataGrid,所述Total column將根據(價格*量)更新,並且總TextBox也將總共添加了所有行。

但是,當我更改一行的數量時,更新了Total column,但總計TextBox沒有。

這是我的代碼,在此先感謝。

public partial class pgCheckout : Page { 

    ObservableCollection<SaleItem> items = new ObservableCollection<SaleItem>(); 

    public pgCheckout() { 
     InitializeComponent(); 
     dgItems.ItemsSource = items; 
     dgItems.Loaded += SetMinWidths; 
     items.CollectionChanged += setTotal; 
    } 

    public void setTotal(object source, EventArgs e) { 
     decimal total = 0; 
     foreach(SaleItem i in items) { 
      total += i.Total; 
     } 

     txtTotal.Text = total.ToString(); 
    } 


    public void SetMinWidths(object source, EventArgs e) { 
     foreach (var column in dgItems.Columns) { 
      if (column.DisplayIndex != 0) { 
       column.MinWidth = column.ActualWidth; 
       column.Width = new DataGridLength(1, DataGridLengthUnitType.Star); 
      } 
     } 
    } 

    private void btnRemove_Click(object sender, RoutedEventArgs e) { 
     items.RemoveAt(dgItems.SelectedIndex); 
    } 

    private void btnAdd_Click(object sender, RoutedEventArgs e) { 
     bool exist = false; 
     foreach (SaleItem i in items) { 
      if (i.ItemID.Equals(txtItemID.Text)) 
       exist = true; 
     } 

     if (exist) { 
      lblErr.Content = "Item already exist"; 
      txtItemID.Text = ""; 
     } 

     else { 

      using (var db = new PoSEntities()) { 
       var query = from i in db.Items 
          where i.ItemID.Equals(txtItemID.Text.Trim()) 
          select i; 
       var itm = query.FirstOrDefault(); 
       if (itm == null) { 
        lblErr.Content = "Invalid Item"; 
        txtItemID.Text = ""; 
       } 
       else { 
        txtItemID.Text = ""; 
        lblErr.Content = ""; 
        items.Add(new SaleItem() { 
         Num = items.Count + 1, 
         ItemID = itm.ItemID, 
         Name = itm.Name, 
         Price = decimal.Round(itm.Price, 2, MidpointRounding.AwayFromZero), 
         Quantity = 1, 
        }); 
       } 
      } 
     } 
    } 

    private void txtItemID_KeyUp(object sender, KeyEventArgs e) { 
     if (e.Key == System.Windows.Input.Key.Enter) { 
      btnAdd_Click(txtItemID, e); 
     } 
    } 
} 

class SaleItem : INotifyPropertyChanged { 
    public int Num { get; set; } 
    public string ItemID { get; set; } 
    public string Name { get; set; } 

    private decimal price; 
    public decimal Price { 
     get { return price; } 
     set { 
      this.price = value; 
      OnPropertyChanged("Total"); 
     } 
    } 
    public int quantity; 
    public int Quantity { 
     get { return quantity; } 
     set { 
      this.quantity = value; 
      OnPropertyChanged("Total"); 
     } 
    } 

    public decimal Total { 
     get { return decimal.Round(Price * Quantity, 2, MidpointRounding.AwayFromZero); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) { 
     var handler = PropertyChanged; 
     if (handler != null) { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

你可以顯示'SaleItem'類嗎? –

+0

SaleItem類包含在代碼的底部附近。 – Edwin

回答

7

ObservableCollection.CollectionChanged在集合中添加或刪除某些內容而不是單個成員正在更新時觸發。

... 
else 
{ 
    txtItemID.Text = ""; 
    lblErr.Content = ""; 
    SaleItem newItem = new SaleItem() { 
        Num = items.Count + 1, 
        ItemID = itm.ItemID, 
        Name = itm.Name, 
        Price = decimal.Round(itm.Price, 2, MidpointRounding.AwayFromZero), 
        Quantity = 1 }; 
    newItem.PropertyChanged += 
      new PropertyChangedEventHandler(newSaleItem_PropertyChanged); 

    items.Add(newItem); 
} 
... 

這是newSaleItem_PropertyChanged

void newSaleItem_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    setTotal(null, null); 
} 
+0

我明白了。我應該如何解決這個問題? – Edwin

+1

如果你的'SaleItem'實現'INotifyPropertyChanged',那麼你可以爲每個'SaleItem'使用'PropertyChanged'事件。我要編輯我的帖子。 –

+0

是的!有效!十分感謝你的幫助。 – Edwin

0
ObservableCollection<SaleItem> items = new ObservableCollection<SaleItem>(); 

必須爲屬性格式

改變它

public ObservableCollection<SaleItem> items {get;set;} 

並執行新的構造

或使get函數創建新的對象,如果一個沒有按不存在

您必須擁有公共的getter/setter才能使用綁定

0

SaleItem必須實現INotifyPropertyChanged那麼你將有PropertyChanged事件,您可以訂閱。使用INotifyPropertyChanged將很適合綁定。