WP7 - c# - silverlight - 在页面之间传递XML数据

3

好的,经过一周的观看和阅读教程,我仍然无法在页面之间传递xml数据。一开始我对c#一无所知,现在能够理解一些了。

如果你能指导我或者至少告诉我从哪里开始就好了。好的,这是我想做的事情,但我无法实现:

例如,我有一个像这样的xml数据;

<document>
    <car id="01">
        <manufacturer>Ford</manufacturer>
        <model>Mustang</model>
        <year>1965</year>
        <details>The Ford Mustang of 1965 was first unveiled bla bla for example....</details>
    </car>
    <car id="02">
        <manufacturer>Chevrolet</manufacturer>
        <model>Nova</model>
        <year>1967</year>
        <details>The Chevrolet Nova of 1967 was bla bla for example....</details>
    </car>
    <car id="03">.....
</document>

我希望在mainpage.xaml的列表框中显示制造商和型号(目前已经可以正常工作)。

TextBlock Text="{Binding manufacturer}"
TextBlock Text="{Binding model}"

当单击模型名称时,我希望在另一页(例如details.xaml)中显示该模型的年份和详细信息。
我能够使用以下方法传递简单文本,但我无法传递绑定,并且它对我没有用。 它只列出所有汽车的详细信息和年份,而不是我在主页面中选择的特定汽车。
this.NavigationService.Navigate(
new Uri("/details.xaml?......

提前感谢您。如果我打扰到您了,对不起。


你使用(了解)ViewModels(MVVM)吗? - H H
3个回答

2

不需要在页面之间传递长字符串的XML数据,只需传递汽车的ID即可。由于您正在将数据绑定到mainpage.xaml上的ListBox,我假设您有一个类似以下的类:

public Class Car {
  public string manufacturer;
  public string model;
  public unsigned int id;

  // ...
}

启动时读取XML文件并创建一个Car对象的ObservableCollection,将其绑定到ListBox。然后,在ListBoxItemTap手势处理程序中执行以下操作:

private void OnListBoxItemTapped( object sender, GestureEventArgs e )
{
  var car = sender.DataContext as Car;

  if( car != null ) {
    // Navigate to page that will display the car details
    NavigationService.Navigate(
          new Uri( String.Format( "/detailspage.xaml?id={0}",
            Uri.EscapeDataString( car.id ) ), UriKind.Relative ) );
  }
}

接下来,在详细页面的OnNavigatedTo方法中,只需使用id找到正确的汽车,并将该对象绑定到页面的DataContext

请注意,如果您的ID始终为数字,则不需要使用EscapeDataString。 如果您真的想直接传递所有XML数据,也可以通过将ID替换为XML字符串数据来实现。


1
+1 但是 Dictionary<int, Car> 比可观察集合更好。 - AnthonyWJones
@AnthonyWJones:同意,如果汽车列表永远不会改变,ObservableCollection是不必要的。此外,使用Dictionary应该可以实现高效的搜索。 - Praetorian

1
为什么不直接解析XML...然后使用MVVM将整个内容发送过去...
在详细页面中,你会得到类似这样的东西:
 Messenger.Default.Register<YourClass>(this, "Display", s => SomeFucToDisplay(s));

然后你只需从主页发送它:

  Messenger.Default.Send(YourClass, "Display");

这是一个链接,你可以在这里找到更多http://www.galasoft.ch/mvvm/相关的内容。


1

在导航的URL中,您只能传递简单的字符串,因此在您的情况下,您可以在详细信息导航中包含一个"?id=xx"。您的详细信息页面可以从您的数据请求具有指定ID的汽车。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接