2010-11-23 5 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.dll内)WindowsBaseは

このコレクションは、リストが変更されるたびにイベントを発生させます(たとえば任意の項目が追加され、リストから削除)

注: ObservableCollectionは、保持しているオブジェクトの内部プロパティが変更された場合、イベントを発生させません。私に知らせる必要がある場合は、Observableコレクションを拡張してその機能も持たせました。

+1

あなたはそのコレクションを投稿できますか?他の人には便利だと思うだろうと確信しています(ただし、私はおそらく私自身を実装しています)。 –

+2

このようなクラスの非常に優れた実装は次のとおりです。http://stackoverflow.com/a/5256827/830254 –

+1

ObservableCollection.Clear()はNotifyCollectionChangedEventArgsでCollectionChangedイベントを発生させます。Action == Resetと空のOldItemsとNewItemsによって、コレクションから削除されたアイテム – Lu55

関連する問題