2011-08-17 76 views
2

我想要一個自定義的observablecollection,以便在添加項目之前添加一個MyObj類型的項目並調用MyObj.DoCalc()。我也希望能夠將一個列表傳遞給myCustomCollection的構造函數,就像基類一樣,以便將項目設置爲該列表。C#自定義ObservableCollection

public class MyObservableCollection : ObservableCollection<MyObj> 
{ 

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
     { 

      // perform calculation 
     } 
     base.OnCollectionChanged(e); 

    } 


} 

這就是我得到的。我不知道如何重寫構造函數,並且Items是隻讀的,所以我不知道如何將其設置爲傳入列表。提前致謝。

+0

考慮不從集合繼承。您可以將subsscribe更改事件,而不是覆蓋。 http://stackoverflow.com/questions/2242919/should-i-instantiate-a-collection-or-inherit-from-collection – 2011-08-17 18:59:11

回答

3

對於第一個問題,NotifyCollectionChangedEventArgs有一個NewItems屬性。只是循環通過。

if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)` 
{ 
    foreach(var item in e.NewItems.Cast<MyObj>()) 
     item.DoCalc(); 
} 

我不確定這是調用的順序。

爲了您的第二個問題,這裏是你需要的代碼:

public MyObservableCollection(IEnumerable<MyObj> items) : base(items) 
{ 
} 
+0

幹得好。我不喜歡C# - 忘了:base。非常感謝! – Yatrix