miércoles, julio 19, 2006

Más Generics - DataEventArgs

Cada vez le encuentro más usos a los delegados. Hace poco postee respecto al uso del generic EventHandler, que te permitia no tener que declarar un delegado para todo.

 

Sin embargo, por si sólo el EventHandler, aún necesitaba ser acompañado de algún EventArgs.

 

Bueno recapitulando normalmente haríamos lo siguiente para poder tener un evento que mande a sus suscriptores quien mando el metodo y una string con la clave del articulo seleccionado.

 

 

public delegate void ClaveSelectedEventHandler(object sender, ClaveSelectedEventArgs e);

 

Esa firma es necesaria para cumplir con las convenciones de nombres, todos los eventos en .NET tienen un delegado que requiere un objeto que indique quien lanzo el evento y unos event args con datos del evento.

 

Bueno, ahora necesitamos crear la clase ClaveSelectedEventArgs

 

 

public class ClaveSelectedEventArgs:EventArgs

{

public ClaveSelectedEventArgs(string clave)

{

this.clave = clave;

}

private string clave;

public string Clave

{

get { return clave; }

}

}

 

Note que ClaveSelectedEventArgs debe heredar de EventArgs, esto es muy útil, aunque para algunos pudiera parecer un simple capricho de convención de nombres, pero sirve para que metódos más genéricos (no generics, sino que no esperen un EventArgs tan específico aún puedan suscribirse a nuestro evento).

 

Por pen-último declaramos un evento del tipo ClaveSelectedEventHandler

 

public event ClaveSelectedEventHandler ClaveSelected;

 

Ahora si por último, lanzamos el evento:

 

if (ClaveSelected != null)

ClaveSelected(this, new ClaveSelectedEventArgs("clave");

 

Es importante validar si el evento no es nulo antes de querer lanzarlo, esto nos garantiza que realmente haya alguien suscrito y nos evita la posibilidad de generar un NullReferenceException.

 

Bueno todo listo para que alguien se suscriba de la siguiente manera:

 

this.ClaveSelected+=new MiEventHandler(View_ClaveSelected);

 

void View_ClaveSelected(object sender, SplashView.ClaveSelectedEventArgs MiEventArgs)

{

throw new Exception("The method or operation is not implemented.");

}

 

Como les comentaba, el metodo que usamos para hacer algo con ese evento, pudiera ser algo más genérico:

void View_ClaveSelected(object sender, EventArgs MiEventArgs)

{

throw new Exception("The method or operation is not implemented.");

}

 

Ese metodo puede escuchar a cualquier evento que cumpla con los naming conventions.

 

 

Bueno, ahora si, quieren ver la parte fácil? Creo que fue mucho rollo introductorio:

 

public event EventHandler<DataEventArgs<string>> ClaveSelected;

 

Eso es todo lo que tenemos que hacer en lugar de declarar un delegado y una clase EventArgs que encapsule un string. Todo el resto del código (lanzar el evento y suscribirse es identico).

 

Pero bueno como un string se puede usar para muchas cosas, valdría la pena decir que significa para nosotros:

///

/// Se lanza sl momento de que se seleccione una clave y la manda en los DataEventArgs

///

public event EventHandler<DataEventArgs<string>> ClaveSelected;

 

Eso se ve mejor.

 

Bueno, sólo para que lo vean completo, así lanzamos el evento:

 

if (ClaveSelected != null)

ClaveSelected(this, new DataEventArgs("Clave"));

 

Así nos suscribimos a el:

 

this.ClaveSelected += new EventHandlerDataEventArgs<string>>(SplashView_ClaveSelected);

 

Y así lo cachamos:

 

void SplashView_ClaveSelected(object sender, DataEventArgs e)

{

throw new Exception("The method or operation is not implemented.");

}

 

O así si quisieramos hacerlo más genérico:

 

void SplashView_ClaveSelected(object sender, EventArgs e)

{

throw new Exception("The method or operation is not implemented.");

}

 

Algo muy importante es que DataEventArgs lo puede usar con cualquier otra cosa que necesiten mandar como argumento, por ejemplo:

DataEventArgs<MiClase>

DataEventArgs<int>

No hay comentarios.: