#c# #xml #linq #windows-phone-7.1
#c# #xml #linq #windows-phone-7.1
Вопрос:
В настоящее время я занимаюсь небольшим проектом, который берет XML-документ, анализирует его через Linq (выбирая определенные элементы), а затем привязывает его к списку через асинхронный httpwebrequest.
Вот код;
void ResponseCallBack(IAsyncResult result)
{
//get to the request object
HttpWebRequest myRequest = result.AsyncState as HttpWebRequest;
try
{
//need error checking
HttpWebResponse response = myRequest.EndGetResponse(result)
as HttpWebResponse;
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
String s = sr.ReadToEnd();
XElement xmlSearch = XElement.Parse(s);
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
lstbBouquets.ItemsSource = from Search in xmlSearch.Descendants("e2service")
select new GetBouquets
{
e2servicename = Search.Element("e2servicename").Value
};
});
//System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { Debug.WriteLine(s); });
// Stop progress bar
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { performanceProgressBar.IsIndeterminate = false; });
}
}
catch (WebException webExcp)
{
//Debug only, needs error checking
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { Debug.WriteLine(webExcp.ToString()); });
}
}
Правильно ли я использую диспетчер для связи с потоком пользовательского интерфейса, чтобы обновить список? При выполнении listbox ничего не получает, и я получаю следующий вывод от VS;
Первое случайное исключение типа ‘System.Метод accessexception’ произошел в mscorlib.dll ‘Задача пользовательского интерфейса’ (управляемая): загружена ‘System.SR.dll ‘ Первое случайное исключение типа ‘System.IO.FileNotFoundException’ произошло в mscorlib.dll Система.Windows.Ошибка данных: не удается получить значение ‘e2servicename’ (введите ‘System.Строка’) из ‘DreamboxRemote.Страницы.GetBouquets’ (введите ‘DreamboxRemote.Страницы.GetBouquets’). Выражение привязки: Path=’e2servicename’ DataItem=’DreamboxRemote.Страницы.GetBouquets’ (hashCode=98879357); целевой элемент — ‘System.Windows.Элементы управления.TextBlock’ (Name=»); целевым свойством является ‘Text’ (введите ‘System.Строка’).. Система.Исключение MethodAccessException: попытка получить доступ к методу не удалась: DreamboxRemote.Страницы.GetBouquets.get_e2servicename() в системе.Отражение.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] параметры, CultureInfo culture, StackCrawlMarkamp; stackMark) в системе.Отражение.Запускает исключение первого шанса типа ‘System.Метод accessexception’ произошел в mscorlib.dll
Я предполагаю, что я неправильно обрабатываю потоки, но не вижу, где?
РЕДАКТИРОВАТЬ: я должен отметить, что когда строка записи отладки раскомментирована, она правильно выводит полный XML-документ.
Ответ №1:
Я подозреваю, что проблема связана с замыканием вокруг оператора linq.
Вы не можете привязать ItemsSource таким образом.
Я бы взял вывод из инструкции linq и установил для него свойство, а затем обновил фактический itemssource в потоке пользовательского интерфейса после того, как у вас будут данные.
Bouquets = from Search in xmlSearch.Descendants("e2service")
select new GetBouquets
{
e2servicename = Search.Element("e2servicename").Value
};
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
lstbBouquets.ItemsSource = Bouquets;
});
Ответ №2:
Search.Element("e2servicename")
может быть нулевым или
Search.Element("e2servicename").Value
может возвращать значение null. Явные операторы преобразования (string или Nullable) предпочтительнее свойства .Value для обработки возможного значения null .
Вы можете прочитать больше об этом здесь .
e2servicename = (string) Search.Element("e2servicename")