2010-11-23 86 views
4

我是事件中的新手。 This example顯示每次更改ArrayList時都會調用一個事件。我想知道如何使用泛型。爲了實現IList還是擴展List?我試圖編碼,但我卡住了。如何在列表中更改事件列表

using System; 
using System.Collections.Generic; 

namespace Events 
{ 
    public delegate void ChangedEventHandler(object sender, EventArgs e); 

    public class ListWithChangedEvent<T> : IList<T> 
    { 
     public event ChangedEventHandler Changed; 

     protected virtual void OnChanged(EventArgs e) 
     { 
      if (Changed != null) 
      { 
       Changed(this, e); 
      } 
     } 

     public void Add(T value) 
     { 
      base.Add(value); 
      OnChanged(EventArgs.Empty); 
     } 

     public void Clear() 
     { 
      base.Clear(); 
      OnChanged(EventArgs.Empty); 
     } 

     public T this[int index] 
     { 
      set 
      { 
       base[index] = value; 
       OnChanged(EventArgs.Empty); 
      } 
     } 
    } 

    class EventListener 
    { 
     private ListWithChangedEvent<string> List; 

     public EventListener(ListWithChangedEvent<string> list) 
     { 
      List = list; 
      List.Changed += new ChangedEventHandler(ListChanged); 
     } 

     private void ListChanged(object sender, EventArgs e) 
     { 
      Console.WriteLine("This is called when the event fires."); 
     } 

     public void Detach() 
     { 
      List.Changed -= new ChangedEventHandler(ListChanged); 
      List = null; 
     } 
    } 

    class Program 
    { 
     public static void Main(string[] args) 
     { 
      ListWithChangedEvent<string> list = new ListWithChangedEvent<string>(); 

      EventListener listener = new EventListener(list); 

      list.Add("item 1"); 
      list.Clear(); 
      listener.Detach(); 
     } 
    } 
} 

回答

6

你可以使用ObservableCollection,你可以擴展它!
命名空間:System.Collections.ObjectModel
集:WindowsBase(在WindowsBase.dll)

該集合觸發每當列表變化事件(比如添加任何物品,從列表中移除)

但是注意:如果ObservableCollection所保存的對象的內部屬性發生更改,則它不會觸發事件。如果你需要的話,請告訴我,我已經擴展了Observable集合以具備該功能。

+1

你可以發佈該集合嗎?我相信其他人會發現它很有用(雖然我可能只是在實施自己的同時)。 – 2012-06-22 20:24:14

相關問題