2014-01-30 108 views
1

如果集合中的某個項目的值發生更改,則無法獲取總計數計算結果。我在課上有INotifyPropertChanged活動,集合是ObservableCollection<T>。我也試過BindingList<T>,但沒有運氣。使用INotifyPropertyChanged計算總數

public class Inventory 
{ 
    public ObservableCollection<Item> Items { get; set; } 
    public int TotalCount { 
     get { return Items.Select(i => i.Count).Sum(); } 
    } 

} 

public class Item : INotifyPropertyChanged { 

    private int count; 
    public int Count { 
     get { return count; } 
     set { 
      count = value; 
      NotifyPropertyChanged("Count"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChanged(string propertyName) { 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

我的下一個雖然是登記爲被添加到集合中的每個項目的事件處理程序,但我不太清楚如何管理可能已經註冊的事件。看來我缺少一些簡單的東西,任何人都可以指出它?

順便說一句,我是WPF的數據綁定到這個類。

回答

0

這裏是說,「繁重的工作」的代碼...先在Inventory構造:

Items.CollectionChanged += Items_CollectionChanged; 

然後在Inventory類的主體:

void Items_CollectionChanged(object s, NotifyCollectionChangedEventArgs e) { 
    if (e.OldItems != null) 
     foreach (INotifyPropertyChanged item in e.OldItems) 
      item.PropertyChanged -= ItemPropertyChanged; 
    if (e.NewItems != null) 
     foreach (INotifyPropertyChanged item in e.NewItems) 
      item.PropertyChanged += ItemPropertyChanged; 
} 

void ItemPropertyChanged(object s, PropertyChangedEventArgs e) { 
    if (e.PropertyName == "Count") 
     NotifyPropertyChanged("TotalCount"); 
} 
+0

請注意:此代碼錯誤。如果在集合上調用Clear方法(在這種情況下,「Action」爲「Reset」並且OldItems和NewItems列表都是空的),ItemPropertyChanged處理程序不會從項目中移除。 – Athari

1

您需要處理CollectionChanged事件,訂閱新添加的項目並取消訂閱已刪除的項目。這是一項單調乏味的工作,因此您可以繼承ObservableCollection並覆蓋OnCollectionChanged

有關示例實現,請參閱GitHub/Alba.Framework/NotifyingCollection(T).cs(它在項目中有一些依賴關係,因此您將無法複製粘貼它)。某處有一個更簡單的StackOverflow實現,但目前我找不到它。