1

我目前正在开发 Windows phone 7 的应用程序我正在尝试获取多个 rss 提要并将每个提要显示在不同的列表框中

我创建了一个名为的自定义类

public class RssFeed
    {
        public string Title { get; set; }

        public string Url { get; set; }

        public ListBox MyListBox { get; set; }
    }

我创建了一个 RssFeed 列表,我正在尝试执行以下操作

 foreach (RssFeed item in items)
            {
                WebClient webClient = new WebClient();
                webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler((sender, e) => this.webClient_DownloadStringCompleted(sender, e, item.MyListBox));
                webClient.DownloadStringAsync(new System.Uri(item.Url));    
            }

我有活动

private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e,ListBox listBox)

问题是参数 listBox 对于所有事件都是相同的,这是我创建事件处理程序时的最后一个 ListBox

例如:我有列表项,其中第一项具有等于 ListBox1 的 MyListBox 第二项具有等于 ListBox2 的 MyListBox

将始终使用参数 ListBox2 调用事件 webClient_DownloadStringCompleted

我该怎么做才能为参数获取不同的值。谢谢你

4

2 回答 2

2

您以错误的方式使用局部变量“项目”。由于将在代码实际运行时(在 foreach 循环结束很久之后)计算 Lambda 表达式,因此 item 变量将始终指向集合中的最后一个元素。

解决方案:

foreach (RssFeed item in items)
        {
            var localItem = item;
            WebClient webClient = new WebClient();
            webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler((sender, e) => this.webClient_DownloadStringCompleted(sender, e, localItem.MyListBox));
            webClient.DownloadStringAsync(new System.Uri(localItem.Url));    
        }
于 2012-08-17T15:11:04.360 回答
1

访问修改后的关闭问题。

将您的代码更新为:

foreach (RssFeed item in items)
{
    var itemCopy = item;
    WebClient webClient = new WebClient();
    webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler((sender, e) => this.webClient_DownloadStringCompleted(sender, e, itemCopy.MyListBox));
    webClient.DownloadStringAsync(new System.Uri(itemCopy.Url));    
}
于 2012-08-17T15:15:21.833 回答