
我不能简单地将其注册为事件处理程序,因为它不接受事件处理程序委托所需的参数.另外,不同类型的控件具有不同的签名,因此我不能只让ValIDate匹配一个签名而忽略其内容.
这是我设置的一个小例子
txt1.TextChanged += ValIDate_TextChange; password1.PasswordChanged += ValIDate_RoutedEvent; txt2.TextChanged += ValIDate_TextChange; txt3.TextChanged += ValIDate_TextChange; password2.PasswordChanged += ValIDate_RoutedEvent; txt4.TextChanged += ValIDate_TextChange;voID ValIDate_RoutedEvent(object sender,RoutedEventArgs e){ ValIDateOptions();}voID ValIDate_TextChange(object sender,TextChangedEventArgs e){ ValIDateOptions();}public voID ValIDateOptions(){ //Actual valIDation here} 这仅显示了2个示例,更多控件可能具有更多签名.在我不关心传递的参数的情况下,有没有更好的方法让所有事件处理程序调用函数?
编辑:
我喜欢Jon提出的选项来添加参数并简单地忽略它们.这确实解决了大部分问题,但是任何时候我想直接调用这个函数,比如手动触发验证,然后我必须包含伪参数来满足编译器.
ValIDateOptions(this,new EventArgs())
Dan建议使用匿名函数来处理这个问题,但在关联事件处理程序时并不是那么干净.
似乎任何解决方案都不允许您将函数注册为事件处理程序而忽略签名,同时还保留调用函数的能力而不创建伪参数,但有多种方法可以非常接近.
编辑:
以下是实现Jon的通用事件处理解决方案的更新示例,但保留了可以直接调用的0参数函数
txt1.TextChanged += ValIDationEvent;password1.PasswordChanged += ValIDationEvent;txt2.TextChanged += ValIDationEvent;txt3.TextChanged += ValIDationEvent;password2.PasswordChanged += ValIDationEvent;txt4.TextChanged += ValIDationEvent;//Single event handler accepting EventArgs,which is the base class//for all more-specific event classesvoID ValIDationEvent(object sender,EventArgs e){ //Ignores arguments and calls 0 argument ValIDateOptions ValIDateOptions();}//0 argument function that performs actual valIDation and can be called//directly from other functions without the need to pass in a fake sender//and eventargs parameterpublic voID ValIDateOptions(){ //Actual valIDation here}解决方法 您可以使用一个忽略参数的方法: public voID ValIDateOptions(object sender,EventArgs e){} 编译器将允许从ValIDateOptions方法组到正常事件模式之后的任何委托类型的转换,使得第一个参数是sender,第二个参数是从EventArgs派生的某个类型.
总结以上是内存溢出为你收集整理的c# – 为具有不同事件处理程序委托的多个控件实现单个事件处理程序全部内容,希望文章能够帮你解决c# – 为具有不同事件处理程序委托的多个控件实现单个事件处理程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)