2013-04-11 3 views
3

Я пытаюсь связать ObservableCollection с ListBox, но я получаю следующую ошибку: Приложение называется интерфейсом, который был настроен для другого потока. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))(Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

Prueba.cs В классе, у меня есть:

public ObservableCollection<WidgetCollectionItem> WidgetsDownloaded(string e) 
    { 
     int alertas = 0; 

     XDocument document = XDocument.Parse(e); 

     // Obtener el id 
     //id = document.Root.Element("id").Value; 

     ObservableCollection<WidgetCollectionItem> Items = new ObservableCollection<WidgetCollectionItem>(); 
     foreach (XElement wid in document.Root.Elements("widget")) 
     { 
      WidgetCollectionItem widget = new WidgetCollectionItem(); 
      widget.captionWid = wid.Attribute("caption") != null ? wid.Attribute("caption").Value : null; 

      ObservableCollection<ServiciosWidgetCollectionItem> ItemsSer = new ObservableCollection<ServiciosWidgetCollectionItem>(); 
      widget.ItemsSer = ItemsSer; 

      foreach (XElement service in wid.Elements("service")) 
      { 
       ServiciosWidgetCollectionItem ser = new ServiciosWidgetCollectionItem(); 

       ser.captionWid = wid.Attribute("caption") != null ? wid.Attribute("caption").Value : null; 
       ser.nameWid = wid.Attribute("name") != null ? wid.Attribute("name").Value : null; 
       ser.nameSer = service.Attribute("name") != null ? service.Attribute("name").Value : null; 
       ser.captionSer = service.Attribute("caption") != null ? service.Attribute("caption").Value : null; 
       ser.descripcion = service.Attribute("desc") != null ? service.Attribute("desc").Value : null; 
       ser.valor = service.Element("xvalue") != null ? service.Element("xvalue").Value : null; 
       ser.color = service.Element("xcolor") != null ? service.Element("xcolor").Value : null; 
       ser.alerta = service.Element("xalert") != null ? service.Element("xalert").Value : null; 
       if (ser.alerta != null) { alertas++; } 

       ItemsSer.Add(ser); 
      } 
      Items.Add(widget); 
     } 
     return Items; 
    } 




public class ServiciosWidgetCollectionItem 
    { 
     public string captionWid { get; set; } 
     public string captionSer { get; set; } 
     public string nameWid { get; set; } 
     public string nameSer { get; set; } 
     public string descripcion { get; set; } 
     public string valor { get; set; } 
     public string color { get; set; } 
     public string alerta { get; set; } 
    } 

    public class WidgetCollectionItem 
    { 
     public string captionWid { get; set; } 
     public ObservableCollection<ServiciosWidgetCollectionItem> ItemsSer { get; set; } 
    } 

И от MainPage сделать подключение к странице, то весь процесс работает отлично, но когда я вставить ListBox ItemsSouces дает мне ошибка:

public MainPage() 
    { 
     this.InitializeComponent(); 

     Prueba prueba = new Prueba(); 

     var request = (HttpWebRequest)WebRequest.Create(new Uri(ruta)); 
     request.BeginGetResponse(r => 
     { 
      var httpRequest = (HttpWebRequest)r.AsyncState; 
      var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r); 

      using (var reader = new StreamReader(httpResponse.GetResponseStream())) 
      { 
       var response = reader.ReadToEnd(); 

       widgetsList.ItemsSource = prueba.WidgetsDownloaded(response); 
      } 
     }, request); 
    } 

ответ

2

widgetsList.ItemsSource разрешена только получить доступ из потока, используемого для создания элемента управления. Обычно это всегда поток пользовательского интерфейса. В MSDN вы можете прочитать около BeginGetResponse, что он запускает асинхронный запрос, поэтому ваш делегат вызывается в другом потоке. Назначьте ответ в исходном потоке (поток пользовательского интерфейса), и все в порядке.

Редактировать: См. Run code on UI thread in WinRT для примера, как достичь этого. Примечание. Сохраните диспетчер при запуске в статической переменной, чтобы облегчить вашу жизнь.

Смежные вопросы