¿Pasar parámetros adicionales a un controlador de eventos?
Digamos que quiero pasar algunos datos adicionales al asignar un controlador de eventos. Considere el siguiente código:
private void setup(string someData)
{
Object.assignHandler(evHandler);
}
public void evHandler(Object sender)
{
// need someData here!!!
}
¿ Cómo haría para entrar someData
en mi evHandler
método?
private void setup(string someData)
{
Object.assignHandler((sender) => evHandler(sender,someData));
}
public void evHandler(Object sender, string someData)
{
// need someData here!!!
}
Me costó mucho entender el ejemplo anterior de @spender, especialmente con: Object.assignHandler((sender) => evHandler(sender,someData));
porque no existe tal cosa Object.assignHandler
en el sentido literal. Así que busqué un poco más en Google y encontré este ejemplo . La respuesta de Peter Duniho fue la que hizo clic en mi cabeza (este no es mi trabajo):
recorte
El enfoque habitual es utilizar un método anónimo con un controlador de eventos que tenga su firma modificada. Por ejemplo:
void Onbutton_click(object sender, EventArgs e, int i) { ... } button.Click += delegate(object sender, EventArgs e) { Onbutton_click(sender, e, 172); };
Por supuesto, no es necesario pasar 172, ni siquiera convertir el tercer parámetro en un int. :)
/recorte
Usando ese ejemplo pude pasar dos ComboBoxItem
objetos personalizados a un Timer.Elapsed
evento usando notación lambda:
simulatorTimer.Elapsed +=
(sender, e) => onTimedEvent(sender, e,
(ComboBoxItem) cbPressureSetting.SelectedItem,
(ComboBoxItem) cbTemperatureSetting.SelectedItem);
y luego en su controlador:
static void onTimedEvent(object sender, EventArgs e, ComboBoxItem pressure, ComboBoxItem temperature)
{
Console.WriteLine("Requested pressure: {0} PSIA\nRequested temperature: {1}° C", pressure, temperature);
}
Este no es ningún código nuevo de los ejemplos anteriores, pero demuestra cómo interpretarlos. Ojalá alguien como yo lo encuentre instructivo y útil para no pasar horas tratando de entender el concepto como lo hice yo.
Este código funciona en mi proyecto (excepto por una excepción que no es segura para subprocesos con los ComboBoxItem
objetos que no creo que cambien el funcionamiento del ejemplo). Me estoy dando cuenta de eso ahora.