Question

Si j'ai une propriété:

public list<String> names { get; set; }

Comment puis-je générer et gérer un événement personnalisé pour les arguments appelé "onNamesChanged" chaque fois qu'un nom est ajouté à la liste?

Était-ce utile?

La solution

Vous devriez consulter la System.ComponentModel.BindingList , en particulier l'événement ListChanged .

Autres conseils

Une BindingList est probablement votre meilleure option car elle comprend un suivi des modifications intégré et une variété d’événements existants que vous pouvez utiliser. Vous trouverez ci-dessous un exemple d’exposition d’un événement personnalisé pour Add qui transmet à l’événement BindingList.


    class Example
    {
        private BindingList<string> m_names = new BindingList<string>();
        public IEnumerable<string> Names { get { return m_names; } }
        public event AddingNewEventHandler NamesAdded
        {
            add { m_names.AddingNew += value; }
            remove { m_names.AddingNew -= value; }
        }
        public void Add(string name)
        {
            m_names.Add(name);
        }
    }

Une alternative à BindingList est ObservableCollection - dans ce cas, vous ' d voulez abonner votre propre gestionnaire d’événements à l’événement CollectionChanged et déclencher votre événement en fonction de l'action.

David Mohundro montre une approche; une autre option consiste à hériter de la collection < T > et remplacer les différentes méthodes:

class Foo {}
class FooCollection : Collection<Foo>
{
    protected override void InsertItem(int index, Foo item)
    {
        // your code...
        base.InsertItem(index, item);
    }
    protected override void SetItem(int index, Foo item)
    {
        // your code...
        base.SetItem(index, item);
    }
    // etc
}

Enfin, vous pouvez créer votre propre liste (IList, IList < T >) à partir des premiers principes - beaucoup de travail, peu d’avantages.

Une approche non orthodoxe pourrait utiliser un cadre AOP tel que PostSharp pour & "; tisser &"; un gestionnaire avant / après l'appel de l'accesseur, qui déclenche un événement.

Vous créez une classe externe contenant le code de traitement avant et / ou après le traitement de votre propriété, vérifiez si la valeur de la propriété a été modifiée entre avant et après et vous déclenchez un événement.

N'oubliez pas qu'en prenant la valeur à des fins de comparaison (dans le code de votre gestionnaire), vous risquez d'entrer dans une boucle infinie (vous appelez l'accesseur de propriété, qui appelle le gestionnaire AOP, qui appelle l'accesseur, etc.). vous devrez peut-être réfléchir à la classe contenant cette propriété pour atteindre le champ de sauvegarde.

Vous n'aurez pas besoin d'exposer la liste directement en tant que propriété et peut-être que votre classe implémentera IList ou une autre, puis que votre gestionnaire d'événements déclenche la méthode Add ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top