2009-06-26 43 views
2
class Foo(){ 
    public List<string> SomeCollection; 
} 

我需要實現一個事件,當事件添加或從集合中刪除時可以觸發。這個怎麼做?如何實現事件

回答

2

List<T>沒有通知支持。你可以看看BindingList<T>,它有事件 - 或Collection<T>,它可以通過覆蓋方法繼承。

如果你想暴露在Foo水平時,或許有點像下面 - 但它可能更容易離開就行了:

class Foo{ 
    public event EventHandler ListChanged; 
    private readonly BindingList<string> list; 
    public Foo() { 
     list = new BindingList<string>(); 
     list.ListChanged += list_ListChanged; 
    } 
    void list_ListChanged(object sender, ListChangedEventArgs e) { 
     EventHandler handler = ListChanged; 
     if (handler != null) handler(this, EventArgs.Empty); 
    } 
    public IList<string> SomeCollection {get {return list;}} 
} 
+1

當ObservableCollection非常好地完成這項工作時,我沒有看到創建自定義Collection類的要點。 – Noldorin 2009-06-26 22:08:45

2

看看(分別在System.ComponentModelSystem.Collections.ObjectModel命名空間)的BindingListObservableCollection類 - 無論是一個人應該爲你做的工作做好。

請注意,這兩個類通常提供相同的功能,但它們確實有點不同。 BindingList通常更適合數據綁定/ UI目的(因此它的名稱),因爲它允許選項取消更新等。然而,ObservableCollection可能更適合您的情況,因爲您只是希望收到變更通知(看起來),並且該類純粹是從這個角度設計的。它們存在於非常不同的命名空間中的事實對此有所提示。如果您需要關於相似性和差異的確切細節,我建議您檢查鏈接的MSDN文檔。

+0

(回答進行評論;還 - 是不是在3.0的ObservableCollection 這可能是一個因素...) – 2009-06-26 22:32:59

+0

MSDN似乎暗示ObservableCollection自.NET 2.0以來一直存在。在功能方面,你說BindingList提供ObservableCollection所做的一切(以及更多)基本上是正確的。但有一點需要注意的是,ObservableCollection實現了INotifyCollectionChanged和INotifyPropertyChanged,在某些情況下這很有用。我也相信WPF在少數情況下需要ObservableCollection。正如我指出的那樣,預期用法也略有不同,儘管這是一件小事。 – Noldorin 2009-06-26 22:37:38

0

基本一...

這裏是一個很好的link

public class Foo 
{ 
private List<string> _SomeCollection; 
public event EventHandler Added; 

public void Add(string item) 
{ 
    SomCollection.Add(item); 
    OnAdd(); 

} 

private void OnAdd() 
{ 
    if (Added != null) 
    { 
     Added.Invoke(this, EventArgs.Empty); 
    } 
} 
}