Domanda

Se ho una proprietà:

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

Come posso generare e gestire un evento personalizzato per amor di argomenti chiamato 'onNamesChanged' ogni volta che un nome viene aggiunto all'elenco?

È stato utile?

Soluzione

Dovresti dare un'occhiata alla System.ComponentModel.BindingList , in particolare Evento ListChanged .

Altri suggerimenti

Una BindingList è probabilmente l'opzione migliore in quanto include il rilevamento delle modifiche incorporato e una varietà di eventi esistenti che è possibile utilizzare. Di seguito è riportato un esempio di esposizione di un evento personalizzato per Aggiungi che inoltra all'evento 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);
        }
    }

Un'alternativa a BindingList è ObservableCollection - in questo caso tu " d desidera iscriversi al proprio gestore di eventi all'evento CollectionChanged e attivare il proprio evento a seconda dell'azione.

David Mohundro mostra un approccio; un'altra opzione è ereditare dalla raccolta < T > e sovrascrive i vari metodi:

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
}

Infine, puoi creare il tuo elenco (IList, IList < T >) dai primi principi: molto lavoro, poco vantaggio.

Un approccio non ortodosso potrebbe usare un framework AOP come PostSharp su " weave " viene chiamato un gestore prima / dopo l'accessor, che genera un evento.

Si crea una classe esterna che contiene il codice di gestione pre e / o post per quando si accede alla propria proprietà, si controlla se il valore della proprietà è cambiato tra pre e post e si genera un evento.

Tieni presente che mentre prendi il valore per il confronto (all'interno del codice del gestore), potresti entrare in un ciclo infinito (chiami l'accessor della proprietà, che chiama il gestore AOP, che chiama l'accessor e così via), quindi potrebbe essere necessario riflettere nella classe contenente questa proprietà per raggiungere il campo di supporto.

Non è necessario esporre l'elenco direttamente come proprietà e forse la tua classe deve implementare IList o alcuni di questi, quindi far sì che il tuo gestore eventi si attivi sul metodo Add ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top