2009-04-08 4 views
2

J'ai une classe statique (DataFormSubject) qui contient un objet de liste générique, comme suit:Création d'un événement qui déclenche lorsqu'une liste est mise à jour

private static List<DataForm> dataForms = new List<DataForm>(); 

D'autres classes qui comptent sur cette liste doivent être dit lorsque la liste est mise à jour, donc je créé un événement personnalisé, et les méthodes associées qui pourraient déclencher lorsqu'un élément est ajouté ou supprimé, comme suit:

public delegate void DataFormsUpdatedHandler(object sender); 
    public static event DataFormsUpdatedHandler DataFormsUpdatedEvent; 

    public static void AddDataForm(DataForm df) 
    { 
     dataForms.Add(df); 
     if (DataFormsUpdatedEvent != null) 
      DataFormsUpdatedEvent(df); 
    } 

    public static void RemoveDataForm(DataForm df) 
    { 
     dataForms.Remove(df); 
     if (DataFormsUpdatedEvent != null) 
      DataFormsUpdatedEvent(df); 
    } 

la liste est disponible à partir de la classe statique via une propriété, comme suit:

Mais le problème ici est que le client peut maintenant ignorer l'événement de mise à jour en accédant à la propriété et faire un ajout direct ou supprimer sur la classe! Par exemple. Comment puis-je empêcher cela, ou y a-t-il un meilleur moyen de réaliser ce que je veux? Idéalement, j'aimerais un événement de mise à jour sur la classe List auquel les observateurs peuvent s'abonner!

+0

En aparté - * rien * qui implique statique les événements (directs ou indirects) sont susceptibles de causer des problèmes. Vous devrez être ** très ** strict sur le désabonnement, sinon vous garderez tous vos objets en vie et vous manquerez de mémoire. –

+0

Je ne suis pas très heureux d'utiliser une classe statique pour cela non plus, mais comment puis-je conserver une seule collection accessible à travers mon application sans passer la collection fromobject à l'objet? – Calanus

Répondre

4

Envisager d'utiliser BindingList<T> ou ObservableCollection<T>; tous les deux font ce que vous voulez de manière standard.

Vous ne pouvez rien faire d'intéressant en sous-classant List<T> - les méthodes ne sont pas virtuelles. Collection<T> est conçu pour être plus extensible, mais dans ce cas tout ce dont vous avez besoin est déjà fourni (par BindingList<T>).

En particulier, cela donne:

  • IBindingList (utilisé par de nombreux composants de liaison de l'interface utilisateur, tels que les grilles)
  • ListChanged - que votre code peut souscrire à la notification détaillée
+0

BindingList a fait l'affaire! – Calanus

0

Ne pas afficher une IList de la classe statique, ne montrent un Enumerable:

public static IEnumerable<DataForm> DataForms 
{ 
    get { return dataForms; } 
    //set { dataForms = value; } 
} 

De cette façon, toutes les modifications doivent être effectuées par votre classe

+0

Cela n'aide pas le code d'appel à recevoir une notification ... –

+0

La classe statique a l'événement de notification. – gcores

Questions connexes