2010-02-24 13 views
20

Es es posible delegar eventos de instancia de objeto interno a los controladores de eventos de objetos Corrent con una sintaxis como esta:¿Es posible "encadenar" EventHandlers en C#?

public class MyControl { 
    public event EventHandler Finish; 

    private Wizard wizard; 
    public MyControl(Wizard wizard) { 
     this.wizard = wizard; 

     // some other initialization going on here... 

     // THIS is what I want to do to chain events 
     this.wizard.Finish += Finish; 
    } 
} 

La motivación para la estructura anterior es que tengo muchos flujos de interfaz de usuario similares a asistentes y quería separar la parte posterior, adelante & Cancelar el manejo de una sola clase para respetar el Principio de Cerrado Abierto y el Principio de Responsabilidad Individual en mi diseño.

Añadiendo un método OnFinish y haciendo la comprobación normal siempre es posible, pero en el caso de que haya muchos eventos anidados, terminará con muchos códigos repetitivos.

Respuesta

32

Dos opciones. Primero:

public event EventHandler Finish 
{ 
    add { wizard.Finish += value; } 
    remove { wizard.Finish -= value; } 
} 

En segundo lugar, como usted ha mencionado:

public event EventHandler Finish; 

wizard.Finish += WizardFinished; 

private void WizardFinished(object sender, EventArgs e) 
{ 
    EventHandler handler = Finish; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

La ventaja de la segunda forma es que el origen del evento a continuación, parece ser la clase intermedia, no el asistente - lo cual es razonable ya que es a lo que se suscribieron los controladores.

+0

Gracias, el razonamiento detrás de la segunda opción es suficiente para implementar el sistema de esa manera. Y gracias por la primera opción también porque no me di cuenta de que había una sintaxis para sobrecargar add. – plouh

+0

Por curiosidad, ¿por qué asigna Finish to handler antes de probar nulo e invocar a Finish? – dckrooney

+0

@dcrooney: Debería haber invocado el controlador en su lugar. Editaré –

Cuestiones relacionadas