2010-12-17 24 views
6

Tengo un WinForm winform1 y 2 usuario controla control1 y control2 en este formularioEscribir un evento personalizado global en C#

Ahora quiero definir un evento encargo, que se eleva/disparado en control1 y recibido en control2. El evento debe ser global y no se define directamente en control1. control2 no debería saber sobre la existencia de control1. El evento también debe plantearse mediante otros controles. ¿Cómo es el código de C# para eso? ¿Necesito algo así como una clase editorial?

Respuesta

8

Lo que describes se parece al Mediator pattern, en el que los objetos se comunican a través de mensajes. Estos mensajes se pueden implementar como eventos, devoluciones de llamada o cualquier otro mecanismo.

Se podría utilizar un aplicación como Messenger clase MVVM Light 's (este marco está destinado para su uso con WPF y Silverlight, pero se puede obtener el código para esta clase en particular y usarlo en Windows Forms)

// Register for a specific message type 
Messenger.Default.Register<TypeOfTheMessage>(this, DoSomething); 
... 

// Called when someone sends a message of type TypeOfTheMessage 
private void DoSomething(TypeOfTheMessage message) 
{ 
    // ... 
} 

// Send a message to all objects registered for this type of message 
Messenger.Default.Send(new TypeOfTheMessage(...)); 

Una gran ventaja de la clase Messenger sobre un evento estático es que utiliza referencias débiles, por lo que no impide la recolección de basura de los objetos suscritos, lo que reduce el riesgo de pérdidas de memoria.

Ver this link para obtener más información acerca de la clase Messenger

8

Se puede utilizar un evento estática:

public static class MyGlobalEvent { 
    public static event EventHandler MyEvent; 

    public static void FireMyEvent(EventArgs args) 
    { 
     var evt = MyEvent; 
     if (evt != null) 
      evt(args); 
    } 
} 

Suscribirse de la forma habitual:

MyGlobalEvent.MyEvent += args => Console.WriteLine("Event Was Fired."); 

fuego como mejor le parezca:

MyGlobalEvent.FireMyEvent(new EventArgs()); 
+4

Tenga cuidado con las fugas de memoria si va por ese camino ... el evento guardará fuertes referencias a sus controladores, y evitará que se recopilen si no se da de baja –

+0

¿Cómo es que el evento contiene fuertes referencias a sus controladores en ¿este caso? ¿Puedes elaborar? – AllSolutions

+0

@AllSolutions, porque los eventos por definición contienen referencias a los manejadores. Es solo que los eventos estáticos nunca salen del alcance, ya que son estáticos, mientras que los eventos de instancia quedarían fuera del alcance junto con el objeto que los contenga cuando se recopile. –

2

Para que pueda crear su editor de formularios (y un mediador entre los controles), y todos sus controles serán suscriptores que serán notificados en el evento.

Un evento se produjo en un control, se notificará la forma y el controlador de eventos en el formulario notificará a otros controles que se suscribieron a este evento.

Cuestiones relacionadas