Pregunta

Si tengo una propiedad:

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

¿Cómo puedo generar y manejar un evento personalizado para argumentos llamado 'onNamesChanged' cada vez que se agrega un nombre a la lista?

¿Fue útil?

Solución

Debería consultar System.ComponentModel.BindingList , específicamente el evento ListChanged .

Otros consejos

Una BindingList es probablemente su mejor opción, ya que tiene un seguimiento de cambios incorporado y una variedad de eventos existentes que puede usar. A continuación se muestra un ejemplo de exposición de un evento personalizado para Agregar que reenvía al 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);
        }
    }

Una alternativa a BindingList es ObservableCollection , en este caso usted ' d desea suscribir su propio controlador de eventos al evento CollectionChanged y dispare su evento dependiendo de la acción.

David Mohundro muestra un enfoque; otra opción es heredar de Collection < T > y anular los diversos métodos:

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
}

Finalmente, puede crear su propia lista (IList, IList < T >) a partir de los primeros principios: mucho trabajo, poco beneficio.

Un enfoque no ortodoxo podría estar utilizando un marco AOP como PostSharp para & "; tejer &"; un controlador antes / después de que se llame al descriptor de acceso, que activa un evento.

Usted crea una clase externa que contiene el código de manejo previo y / o posterior para cuando se accede a su propiedad, verifique si el valor de la propiedad cambió entre pre y post, y genere un evento.

Tenga en cuenta que al tomar el valor para la comparación (dentro de su código de controlador), puede entrar en un bucle infinito (llama al descriptor de acceso de propiedad, que llama al controlador de AOP, que llama al descriptor de acceso y así sucesivamente), entonces es posible que deba reflexionar en la clase que contiene esta propiedad para obtener el campo de respaldo.

Tendrá que no exponer la lista directamente como una propiedad y tal vez que su clase implemente IList o algo así y luego que su controlador de eventos active el método Add ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top