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を持っているリストアイテムがあり、2番目のアイテムがListBox2に等しいMyListBoxを持っている

イベントwebClient_DownloadStringCompletedは、常にパラメーターListBox2を使用して呼び出されます。

必要に応じてパラメータの異なる値を取得するにはどうすればよいですか。ありがとうございました

4

2 に答える 2

2

ローカル変数「アイテム」を間違った方法で使用しています。Lambda 式はコードが実際に実行されたときに評価されるため (foreach ループが終了してからずっと後)、 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 に答える