#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 /