2010-11-23 21 views
4

Je suis un débutant dans les événements. This example montre qu'un événement est appelé chaque fois que ArrayList est modifié. Je voudrais savoir comment le faire en utilisant des génériques. Pour vous implémenter IList ou étendre List? J'ai essayé de le coder mais je suis coincé.Comment avoir des listes avec des événements lors d'un changement dans la liste

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(); 
     } 
    } 
} 

Répondre

6

Vous pouvez utiliser ObservableCollection et vous pouvez l'étendre !!
Espace de noms: System.Collections.ObjectModel
Assemblée: WindowsBase (en WindowsBase.dll)

Cette collection déclenche des événements lorsque la liste est modifiée (par exemple tous les éléments sont ajoutés, supprimés de la liste)

.

Remarque: ObservableCollection ne déclenche pas d'événements si les propriétés internes des objets qu'il contient sont modifiées. Si vous en avez besoin faites le moi savoir, j'ai étendu la collection Observable pour avoir cette fonctionnalité aussi.

+1

Pourriez-vous poster cette collection? Je suis sûr que d'autres le trouveraient utile (bien que je vais probablement mettre en application le mien en attendant). –

+2

Voici une très belle implémentation d'une telle classe: http://stackoverflow.com/a/5256827/830254 –

+1

ObservableCollection.Clear() déclenche un événement CollectionChanged avec NotifyCollectionChangedEventArgs Action == Réinitialiser et vide OldItems et NewItems rend impossible le suivi les éléments qui ont été supprimés de la collection – Lu55