动态分配的事件处理程序上的自定义事件参数
Custom event args on a dynamically assigned event handler
我正在像这样分配一个点击事件处理程序
var buttonEvent = button.GetType().GetEvent("Click");
var eventMethod = GetType().GetMethod("button_Click");
var handler = Delegate.CreateDelegate(buttonEvent.EventHandlerType, this, eventMethod);
buttonEvent.AddEventHandler(button, handler);
点击事件处理程序是这样的:
void button_Click(object sender, EventArgs e) { }
如何将自定义参数传递给处理程序?理想情况下我会喜欢
void button_Click(object sender, MyCustomEventArgs e) { }
我可以在分配事件时设置 MyCustomEventArgs。
简单明了,你做不到。
Button
class 调用该事件,当它调用它时,它会填充参数。在这种情况下,使用 EventArgs
对象(不允许自定义数据)。
这适用于任何事件。除非引发事件的 class 支持某种将自定义数据插入事件流的方法,否则您无法控制它通过事件处理程序为您提供的内容。
请注意, 是 UI 事件处理程序的一个巧妙技巧。因为发送对象保存在 "sender" 中,你可以将 任何东西 放在 "Tag" 属性 中,你可以通过执行以下操作在事件中包含自定义数据:
control.Tag = someObject;
control.Click += (o, e) =>
{
Control c = o as Control;
MyObject data = c.Tag as MyObject;
//use data
};
此外,在 WPF 中,您可以使用 CommandParameter
执行此操作,因为它也是一个通用对象。当然,那不是事件处理程序,但它仍然是相同的总体思路。
我正在像这样分配一个点击事件处理程序
var buttonEvent = button.GetType().GetEvent("Click");
var eventMethod = GetType().GetMethod("button_Click");
var handler = Delegate.CreateDelegate(buttonEvent.EventHandlerType, this, eventMethod);
buttonEvent.AddEventHandler(button, handler);
点击事件处理程序是这样的:
void button_Click(object sender, EventArgs e) { }
如何将自定义参数传递给处理程序?理想情况下我会喜欢
void button_Click(object sender, MyCustomEventArgs e) { }
我可以在分配事件时设置 MyCustomEventArgs。
简单明了,你做不到。
Button
class 调用该事件,当它调用它时,它会填充参数。在这种情况下,使用 EventArgs
对象(不允许自定义数据)。
这适用于任何事件。除非引发事件的 class 支持某种将自定义数据插入事件流的方法,否则您无法控制它通过事件处理程序为您提供的内容。
请注意, 是 UI 事件处理程序的一个巧妙技巧。因为发送对象保存在 "sender" 中,你可以将 任何东西 放在 "Tag" 属性 中,你可以通过执行以下操作在事件中包含自定义数据:
control.Tag = someObject;
control.Click += (o, e) =>
{
Control c = o as Control;
MyObject data = c.Tag as MyObject;
//use data
};
此外,在 WPF 中,您可以使用 CommandParameter
执行此操作,因为它也是一个通用对象。当然,那不是事件处理程序,但它仍然是相同的总体思路。