Передача данных между страницами

Каждая страница Silverlight работает независимо других страниц, и данные каждой страницы приложения недоступны другим страницам. Но иногда нужно передавать данные из одной страницы в другую. Если данные являются простой строкой текста, самый простой способ передачи — добавить строку к URI целевой страницы. Этот метод похож на отправку запросов на веб-сервер.

В нашей программе для работы с клиентами при выборе пользователем клиента из списка нужно передать его имя и адрес на страницу редактирования.

private void customerList_SelectionChanged(object sender, SelectionChangedEventArgs e){ // получение информации о выбранном клиенте Customer selectedCustomer = customerList.SelectedItem as Customer; // формирование строки адреса с информацией о клиенте NavigationService.Navigate(new Uri("/CustomerDetailPage.xaml?name=" + selectedCustomer.Name + "&address=" + selectedCustomer.Address, UriKind.Relative));}

Этот метод вызывается, когда пользователь выбирает клиента. Метод получает информацию о выбранном клиенте и формирует URI целевой страницы, в который добавляет информацию о выбранном клиенте. Часть запроса после символа "?" состоит из двух записей вида имя=значение, разделенных символом "&".

Теперь рассмотрим, как целевая страница может получить и использовать переданную информацию. Для этого необходимо изучить события, возникающие при навигации по страницам Silverlight.

Использование событий при навигации по страницам. При переходе на страницу Silverlight происходит событие OnNavigatedTo, а при уходе со страницы — событиеOnNavigatingFrom. Для получения управления при возникновении этих событий нужно переопределить соответствующие методы в программном коде страницы.

Для того чтобы приложение получило управление при перемещении пользователя к странице, нужно переопределить OnNavigatedTo:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){ string name, address; if (NavigationContext.QueryString.TryGetValue("name", out name)) nameTextBlock.Text = name; if (NavigationContext.QueryString.TryGetValue("address", out address)) addressTextBlock.Text = address;}

Этот метод пытается получить из свойства QueryString объекта NavigationContext значения переданных в строке адреса параметров. Каждый раз, когда пользователь переходит к этой странице, этот метод вызывается и выводит на страницу переданные значения параметров. Можно использовать событие OnNavigatedTo для настройки страницы, когда пользователь переходит к ней. При переходе на страницу можно передавать любое количество параметров.

Если запрашиваемый на странице параметр отсутствует, то программа выполняется дальше без возникновения ошибки. Поскольку параметры передаются в виде обычного текста, нужно внимательно следить за тем, чтобы имена параметров при передаче данных и их считывании совпадали.

Приведенный выше код можно использовать при создании приложения, состоящего из двух страниц, которое позволяет пользователю при выборе клиента выполнить переход на страницу с подробной информацией об этом клиенте.

Однако в этом коде есть проблема, которая возникает при выполнении следующей последовательности действий:

1. Выбор элемента в списке.

2. Переход к странице с подробной информацией.

3. Нажатие кнопки Назад для возврата к списку.

4. Выбор того же самого элемента в списке.

При выполнении этой последовательности действий на странице не будет отображаться информация о том же самом клиенте. Для этого нужно выбрать другого клиента, и затем выбрать первого еще раз. Причина такого поведения состоит в том, что программа использует для перехода событие SelectionChanged, которое не происходит при повторном выборе того же самого клиента. Можно устранить эту проблему, сбрасывая выбор элемента при переходе к этой странице:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){ customerList.SelectedItem = null;}

Теперь при повторном выборе того же самого элемента он будет считаться "новым" выбранным элементом. Однако, установка значения выбранного элемента в null также расценивается как выбор элемента, и при попытке обращения к значению этого свойство возникнет исключение. Избежать этого можно, добавив в обработчик события проверку, был ли выбран элемент:

private void customerList_SelectionChanged(object sender, SelectionChangedEventArgs e){ // отмена вызова, если элемент не выбран if (customerList.SelectedItem == null) return; // код метода}

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: