向事件处理程序传递额外参数

3

你好,我正在尝试迭代一组我创建的自定义按钮。它调用一个WCF服务从数据库中获取一些信息。

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 = result;

我的问题是如何将对按钮的引用作为额外参数传递给EventHandler。 如何正确实现我想做的事情?

谢谢

1个回答

1

你可以考虑两种方法:

  • 声明自己的委托类型/事件参数类型,其中包含额外的数据
  • 在引发类上有一个公共属性,用于公开此数据

如果GetLevelDescriptionCompletedEventArgs是你的类型,那么你已经在做第一种方法了 - 只需在事件参数类型中公开此值;你可以在匿名方法中使用它:

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问题。


谢谢你,伙计,这正是我想要的。 - Marklar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接