2008-10-20 34 views
7

Si tengo una propiedad:C# controladores de eventos personalizados

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

¿Cómo puedo generar y gestionar un evento personalizado para bien de los argumentos llamada 'onNamesChanged' cada vez que un nombre se agrega a la lista?

Respuesta

-1

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

+0

Eso es .NET 1.1 :) Como Marc Gravell dijo ... mucho trabajo, poco beneficio. –

0

David Mohundro muestra un enfoque; otra opción es heredar de la colección de <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 
} 

Por último, puede crear su propia lista (IList, IList <T>) a partir de primeros principios - un montón de trabajo, poco beneficio .

13

Es probable que BindingList sea su mejor opción, ya que tiene incorporado el seguimiento de cambios 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 lo 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); 
     } 
    } 
+1

Dang. Aprendo otra cosa nueva hoy. :) –

+1

¡Vaya, no sabía que pudieras hacer eso con los eventos! Eso es bastante astuto! –

+1

Muy agradable. No tenía idea de que esto era posible – Steve

10

Una alternativa a BindingList es ObservableCollection - en este caso de que le desea suscribir su propio controlador de eventos para el evento CollectionChanged y el fuego de su evento dependiendo de la acción.

+0

Otro voto más aquí. Todavía no puedo dejar de aprender :) –

0

Un enfoque no ortodoxo podría estar utilizando un marco AOP como PostSharp para "tejer" un controlador antes/después de llamar al descriptor, que desencadena un evento.

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

Tenga en cuenta que al tomar el valor de comparación (dentro del código del controlador), puede entrar en un bucle infinito (llame al acceso de propiedad, que llama al manejador AOP, que llama al dispositivo de acceso, etc.), por lo que es posible que deba reflejar en la clase que contiene esta propiedad para obtener el campo de respaldo.

Cuestiones relacionadas