将额外参数传递给EventHandler

问题描述:

嗨我正在尝试遍历我创建的自定义按钮的列表。它调用WCF服务从数据库获取一些信息。将额外参数传递给EventHandler

foreach (LevelButton l in ls) 
{ 
    WayFinderDBService.WayFinderDBServiceClient client = new SilverlightNav.WayFinderDBService.WayFinderDBServiceClient(); 
    client.GetLevelDescriptionCompleted += new EventHandler<SilverlightNav.WayFinderDBService.GetLevelDescriptionCompletedEventArgs>(client_GetLevelDescriptionCompleted); 
    client.GetLevelDescriptionAsync(l.Name);      
} 

我想采取任何从client.GetLevelDescriptionAsync(l.Name)返回;然后将其传递给按钮,例如l.Text =结果;

我的问题是传递一个对按钮的引用作为EventHandler的额外参数。什么是正确的方式来实现我想要做的事情?

感谢

有两种方法可以考虑:

  • 声明自己的委托类型/事件args类型,具有额外数​​据
  • 对暴露饲养类的公共属性这个数据

如果GetLevelDescriptionCompletedEventArgs是你的类型,那么你已经做了第一个 - 所以只是在event-参数类型;您可以在匿名的方式使用它:

foreach (LevelButton l in ls) 
{ 
    LevelButton tmp = l; 
    var client=new SilverlightNav.WayFinderDBService.WayFinderDBServiceClient(); 
    client.GetLevelDescriptionCompleted += delegate (object sender, GetLevelDescriptionCompletedEventArgs args) { 
     tmp.Text = args.SomeProperty; // **must** be tmp.Text, not l.Text 
    } 
    client.GetLevelDescriptionAsync(tmp.Name); // or l.Name; same here 
} 

这里有一个问题,虽然 - 注意tmp以上;这是臭名昭着的foreach/capture问题。

+0

对于那个伴侣的干杯这正是我之后 – Marklar 2009-05-22 05:26:59