我正在使用配方API构建Windows Phone 8应用程序,API以XML格式返回数据,到目前为止,我在解析API响应方面没有遇到太多问题,但在搜索配方后,然后,用户应该可以点击特定的搜索结果并查看有关该配方的更多信息,这是一个包含三个标题的Pivot页面:
获取详细信息和说明页面的元素没有问题,因为API返回的xml中只有一个元素,但是使用Ingredients,每个成分在xml中都有自己的部分,所以我我认为代码中的foreach循环可以将所有细节都放到列表中,但是,当运行应用程序并导航到此页面时,应用程序似乎加载了所有信息的倍数,包括详细信息和说明页面上的项目
因此,现在有很多相同的图像,标题和解密显示在详细信息页面上,说明页面上的许多相同说明以及成分页面上的许多相同成分。我不太确定如何解决这个问题,因为我尝试的一切都不起作用。
从下面的代码中删除foreach循环会停止应用程序加载相同信息的负载,但显然没有任何成分,请参阅下面的代码,我无法发布API链接,因为有多少限制我可以每小时制作一次请求,并将其插入此处以不明确的方式格式化,是否有人知道尝试解决此问题的任何步骤?
代码:
void bigOvenRecipe_RecipeDetailsCompleted(object sender, DownloadStringCompletedEventArgs e)
{
var xdoc = XDocument.Parse(e.Result);
Details content = new Details();
List<Details> contentList = new List<Details>();
try
{
content.RecipeImage = xdoc.Root.Element("ImageURL").Value;
content.Title = xdoc.Root.Element("Title").Value;
content.Description = xdoc.Root.Element("Description").Value;
content.Instructions = xdoc.Root.Element("Instructions").Value;
contentList.Add(content);
foreach (XElement item in xdoc.Elements("Recipe").Elements("Ingredients").Elements("Ingredient"))
{
content.IngredientName = item.Element("Name").Value;
content.IngredientQuantity = item.Element("Quantity").Value;
content.IngredientUnit = item.Element("Unit").Value;
contentList.Add(content);
}
}
catch (Exception error)
{
MessageBox.Show("An error was encountered while performing this request: " + error.Message);
}
detailsList.ItemsSource = contentList.ToList();
ingredientsList.ItemsSource = contentList.ToList();
instructionsList.ItemsSource = contentList.ToList();
}
提前谢谢!
答案 0 :(得分:0)
我看到的一个明显问题是您不断向content
添加相同的contentList
对象。
我猜测Details
是引用类型,而content
只是对该Details
个对象的引用。
你的整个contentList只是对同一个对象的一堆引用。
尝试为每种成分实例化一个新对象。
foreach (XElement item in xdoc.Elements("Recipe").Elements("Ingredients").Elements("Ingredient"))
{
Details content = new Details();
// initialize other values
content.IngredientName = item.Element("Name").Value;
content.IngredientQuantity = item.Element("Quantity").Value;
content.IngredientUnit = item.Element("Unit").Value;
contentList.Add(content);
}