WP7 — c # — silverlight — Передача XML-данных между страницами

#c# #xml #silverlight #data-binding #windows-phone-7

#c# #xml #silverlight #привязка данных #windows-phone-7

Вопрос:

Что ж, после недели просмотра и чтения руководств мне все еще не удавалось передавать 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?......
  

Заранее благодарю вас. Извините, если я вас побеспокоил.

Комментарии:

1. Используете ли вы (знаете ли о) ViewModels (MVVM)?

Ответ №1:

Вместо того, чтобы передавать длинную строку XML-данных между страницами, я бы просто передал идентификатор автомобиля. Поскольку вы привязываете данные к ListBox на mainpage.xaml, я предполагаю, что у вас есть класс, подобный следующему:

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

  // ...
}
  

Прочитайте XML-файл при запуске и создайте ObservableCollection набор Car объектов, который привязан к ListBox . Затем в Tap обработчике жестов для ListBoxItem выполните следующее:

 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 методе страницы сведений просто найдите правильный car с помощью id и привяжите этот объект к объекту страницы DataContext .

Обратите внимание, что EscapeDataString в этом нет необходимости, если ваши идентификаторы всегда числовые. Если вы действительно хотите передать все XML-данные как есть, вы также можете сделать это, заменив идентификатор на XML-строковые данные.

Комментарии:

1. 1 но Dictionary<int, Car> было бы лучше, чем наблюдаемая коллекция.

2. @AnthonyWJones: Согласен, если список автомобилей никогда не меняется, ObservableCollection не нужен. Кроме того, словарь должен обеспечивать эффективный поиск.

Ответ №2:

Вы можете передавать только простые строки в URL-адресе, по которому осуществляется навигация, поэтому в вашем случае вы включаете «?id = xx» в навигацию по вашим данным. Ваша страница сведений может запросить автомобиль с указанным идентификатором из ваших данных.

Ответ №3:

Почему бы вам просто не проанализировать xml … и не отправить все это с помощью mvvm…

на странице сведений у вас будет что-то вроде этого:

  Messenger.Default.Register<YourClass>(this, "Display", s => SomeFucToDisplay(s));
  

и вы отправляете их с главной страницы просто:

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

По этой ссылке вы можете найти больше http://www.galasoft.ch/mvvm /