从Windows Phone 8上的列表框访问特定文本块

时间:2014-11-12 11:04:04

标签: c# windows-phone-8 data-binding textblock

我首先下载并保存到手机中的xml文件,然后在用户导航到应用中的某些页面时打开。现在我已经知道如何使用列表框和一些文本块绑定来查看我想要显示的所有内容。

XML就像:

  <root>
    <ratings>
      <rating>
        <ratings/>
        <businessID/>
        <counters/>
      </rating>
     ...
    </ratings>
  </root>

XAML

   <ListBox x:Name="sI" 
                 Foreground="Sienna" Margin="368,283,61,-144" RenderTransformOrigin="0.5,0.5">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock x:Name="textblock1" Text="{Binding counter} FontSize="30"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
    </ListBox>

我想访问列表框中的文本块,它最多给我5个不同的值,并将它们添加到特定的ProgressBars中。该页面将显示5个Textblocks和5个progressbars,它们将获取Textblocks的值。我经常搜索并尝试了很多东西,但是我收到了各种错误和消息,而不是我想要访问文本块的内容。

这是我加载文件的方式。

  XmlSerializer serializer = new
                    XmlSerializer(typeof(Ratings));
                    XDocument document = XDocument.Load(isoStream);
                    Ratings ratings = (Ratings)serializer.Deserialize(document.CreateReader());

这是我可以使用一些添加的参数查看列表框中的项目

 sI.ItemsSource = ratings.Collection.Where(c => c.businessID == businessID).ToList();

我想做这样的事情。

 textblock1.DataContext/Text = ratings.Collection.Where(c => c.businessID == businessID && c.ratings == "4").ToString();

上面给出了Textblock中的这条消息:

 System.Linq.Enumerable+WhereEnumerableIterator`1[Name_of_the_solution.Rating]

和类似的东西来获取textblock1值并将其放在进度条上

 progressbar4.Value = Double.Parse(textblock1.Text);

我也尝试过那些不成功的事。

  var elem = from element in document.Elements("ratings")
                              where (string)element.Attribute("rating") == "2" &&
                              (string)element.Attribute("businessID") == businessID
                              select elements().Element("counter");

 var filteredData = from c in document.Descendants("Rating")
                                      where c.Attribute("rating").Value == "1" && c.Attribute("businessID").Value == businessID.ToString()
                                     select new Rating()
                                      {
                                          counter = c.Attribute("counter").Value
                                      };

给我几乎相同的信息:

 System.Linq.Enumerable+WhereEnumerableIterator`2[Name_of_the_solution.Rating]

我也想过要绕过这一切,不推荐,但我现在绝望,制作5个包含1个Textblock的列表框,但我仍然无法从中获取价值将每一个放在我想要的进度条上。

提前致谢。

1 个答案:

答案 0 :(得分:0)

当答案如此简单时,我总是试图用错误和困难的方法在编程中做点什么。

  XmlSerializer serializer = new
                    XmlSerializer(typeof(Ratings));
                    XDocument document = XDocument.Load(isoStream);
                    Ratings ratings = (Ratings)serializer.Deserialize(document.CreateReader());

                    var result = ratings.Collection.Where(c => c.businessID == businessID);
                    if (result == null) return;
                    double db = 0.0;

                    ficounter.Text = result.Where(c => c.ratings == 5).Select(c => c.counter).SingleOrDefault();
                    if (double.TryParse(ficounter.Text, out db))
                        fiprogress.Value = db;

                    focounter.Text = result.Where(c => c.ratings == 4).Select(c => c.counter).SingleOrDefault();
                    if (double.TryParse(focounter.Text, out db))
                        foprogress.Value = db;

                    thcounter.Text = result.Where(c => c.ratings == 3).Select(c => c.counter).SingleOrDefault();
                    if (double.TryParse(thcounter.Text, out db))
                        thprogress.Value = db;

                    twcounter.Text = result.Where(c => c.ratings == 2).Select(c => c.counter).SingleOrDefault();
                    if (double.TryParse(twcounter.Text, out db))
                        twprogress.Value = db;

                    oncounter.Text = result.Where(c => c.ratings == 1).Select(c => c.counter).SingleOrDefault();
                    if (double.TryParse(oncounter.Text, out db))
                        onprogress.Value = db;

这样我只需将值传递给var,然后使用查询将值放入Textblock,将该值放入进度条。