Передача данных со страницы на страницу - PullRequest
44 голосов
/ 10 февраля 2011

Я ищу лучший способ передачи данных со страницы на страницу.

На странице A у меня есть кнопка, которая выключает страницу B.
На странице B у меня есть 6 текстовых полей, которые позволяют пользователю вводить информацию. Когда пользователь закончил, нажмите на кнопку, которая возвращает его на страницу А.

Я хочу передать эти данные обратно на страницу А.

Я видел предложения:

  • сборка XML-документов и сохранение в изолированном хранилище
  • используйте класс App для хранения информации в свойствах
  • передать его как строку запроса

Я ищу Лучшую практику. Есть ли такой, который Microsoft рекомендует, или тот, который обычно считается лучшим?

Спасибо

Ответы [ 8 ]

63 голосов
/ 12 мая 2011
PhoneApplicationService.Current.State["yourparam"] = param
NavigationService.Navigate(new Uri("/view/Page.xaml", UriKind.Relative));

тогда на другой странице просто

var k = PhoneApplicationService.Current.State["yourparam"];
23 голосов
/ 10 февраля 2011

Лично я бы сохранил значения, введенные на странице B, в модели (объекте), которая также доступна для страницы A.

В зависимости от того, как вы переходите на страницу А во второй раз, может помочь одно или несколько из следующего, чтобы помочь понять передачу значений между страницами:

Как передать значение изображения на одной странице xaml на другую страницу xaml в Windows Phone 7?

Передача сложного объекта на страницу при навигации в приложении WP7 Silverlight

Как передать объект со страницы xaml на другую?

Как передать значение между страницами Silverlight для WP7?

Как перейти с одной страницы xaml на другую и передать значения?

4 голосов
/ 10 февраля 2011

Одна вещь, которую вы можете рассмотреть, это использовать MVC: пусть ваше приложение будет контроллером, сохранит все данные в модели, а страницы - это просто представления, которые содержат чистую логику пользовательского интерфейса.В этом случае ваши страницы являются художниками, и вы передаете объект модели вокруг.Это обеспечивает хорошую изоляцию бизнес-логики и пользовательского интерфейса, так что вы можете легко их редактировать.

BTW, Silverlight и XAML - отличные инструменты для MVC, поэтому это естественное совпадение.

3 голосов
/ 10 февраля 2011

Здесь есть пара вещей.Прежде всего, если / когда пользователь использует кнопку «Назад» для возврата на страницу А вместо вашей кнопки, выполняется ли обмен информацией в текстовых полях или нет («Назад» = «Отмена» или «Назад» = «ОК»)

Тем не менее, если вы используете NavigationService.GoBack (которым вы должны быть вместо NavigationService.Navigate, потому что, если вы используете вызов Navigate, повторные нажатия клавиши «Назад» вызовут все виды плохого UX для ваших пользователей),тогда QueryStrings не вариант.Поскольку страницы действительно не могут ссылаться друг на друга в навигационной системе WP7 Silverlight, вам необходимо использовать стороннюю информацию для хранения ваших данных.Для этого вы можете обратиться к (a) изолированному хранилищу (медленное и тяжелое, но отказоустойчивое), (b) использовать словарь PhoneApplicationService.State или (c) использовать какие-либо глобальные свойства, либо зависшие в приложении.объект, или используя Statics / Singletons ...

Не забывайте следить за поведением Tombstoning, когда вы делаете это - ваша страница будет обрабатывать метод OnNavigatedTo, когда (а) вы переходите к нему в своем приложении (б) вы переходитевернитесь к нему, когда завершите свою работу на странице B, или (c) вы захороните свое приложение на этой странице и вернетесь к нему с помощью клавиши «Назад».

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

2 голосов
/ 10 февраля 2011

Если вы создаете новый проект Windows Phone и используете Шаблон данных Windows Phone , у вас будет большая часть работы, выполненной за вас.

То, что вы хотите сделать, это настроитьViewModel, чтобы содержать все данные для вашего приложения.Вы можете сериализовать и десериализовать эти данные, используя IsolatedStorage, чтобы они сохранялись между сеансами приложения и при Tombstoning.

В шаблоне вы заметите MailViewModel и ItemViewModel .MainViewModel хранит все данные, в которых нуждается ваше приложение, включая ObservableCollection ItemViewModel, а ItemViewModel представляет отдельный тип данных для вашего приложения.

На странице DetailsPage.xaml вы хотите привязать DataBind каждого текстового поля к App.MainViewModelПредметы.Установите привязку к TwoWay, если вы хотите, чтобы ViewModel обновлялся, как только пользователь манипулирует данными в DetailsPage.xaml.При желании вы можете установить Binding на OneWay, а затем кнопку OK, которая записывает изменения обратно в ViewModel и сохраняет в IsolatedStorage.

Вот пример того, как выглядит Binding:

<TextBlock x:Name="ListTitle" Text="{Binding LineOne}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>

В этом случае LineOne является свойством ItemViewModel, и страница получает эти данные из строки запроса, когда пользователь выбирает элемент из MainPage.xaml.DataContext для страницы определяет, откуда берется информация о привязке данных.

Вот фрагмент, где MainPage передает выбранный элемент из ViewModel в DetailsPage.

// Handle selection changed on ListBox
private void MainListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // If selected index is -1 (no selection) do nothing
    if (MainListBox.SelectedIndex == -1)
        return;

    // Navigate to the new page
    NavigationService.Navigate(new Uri("/DetailsPage.xaml?selectedItem=" + MainListBox.SelectedIndex, UriKind.Relative));

    // Reset selected index to -1 (no selection)
    MainListBox.SelectedIndex = -1;
}

Вот какDetailsPage получает выбранный элемент.

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    string selectedIndex = "";
    if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex))
    {
        int index = int.Parse(selectedIndex);
        DataContext = App.ViewModel.Items[index];
    }
}

Поиграйте с шаблоном по умолчанию выше и задайте любые дополнительные вопросы.

Прелесть привязки данных и ObservableCollection заключается в том, что вы можете просто обновить данные иUX немедленно отразит эти изменения.Это связано с тем, что при любых изменениях данных происходит событие:

public string LineOne
{
    get
    {
        return _lineOne;
    }
    set
    {
        if (value != _lineOne)
        {
            _lineOne = value;
            NotifyPropertyChanged("LineOne");
        }
    }
}

NotifyPropertyChanged (), которое передает эту информацию в представление.

1 голос
/ 19 ноября 2013

Одним из вариантов является использование Application.Resources:

Хранение данных:

Application.Current.Resources.Add("NavigationParam", customers);

NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative));

Извлечение данных:

var customers = (List<Customer>) Application.Current.Resources["NavigationParam"];

Вот сообщение в блоге, описывающее это более подробно: http://mikaelkoskinen.net/windows-phone-pass-data-between-pages-application-resources/ (автор: я)

1 голос
/ 12 октября 2011

как я реализовал вот так .. Правильно ли это или нет, я не знаю ..

Когда вы нажимаете на страницу списка новостей, она должна открыть страницу с подробностями о новостях.Я хочу передать содержимое выбранного элемента новостей со страницы списка новостей на страницу сведений о новостях.

страница списка новостей содержит следующий метод.

 protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        NewsDetailsPage newsDetailPage = (e.Content as NewsDetailsPage);
        if (newsDetailPage != null)
            newsDetailPage.SelectedNewsItem = SelectedNewsItem; //Contains the news details
        base.OnNavigatedFrom(e);
    }

на странице сведений о новостях.Вы можете получить доступ к этому (SelectedNewsItem) объекту.

Это может быть или не быть правильным.

1 голос
/ 10 мая 2011

Вы также можете сохранить простоту и использовать PhoneApplicationService.Current.State, который по сути является хеш-таблицей. Вам нужно будет реализовать свой собственный маршаллинг для изолированного хранилища и из него, если вы хотите, чтобы что-либо пережило приложение.

Предложение Омара использовать шаблон данных Windows Phone, вероятно, лучшая идея на этой странице. Это равносильно моему предложению, но вы получите лучший результат (более понятный код) за счет более длинной и крутой кривой обучения.

Я предлагаю тебе сделать это по-моему, а затем повторить это, как Омар.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...