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

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

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

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

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

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

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

Спасибо

Ответ 1

PhoneApplicationService.Current.State["yourparam"] = param
NavigationService.Navigate(new Uri("/view/Page.xaml", UriKind.Relative));

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

var k = PhoneApplicationService.Current.State["yourparam"];

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Что вы хотите сделать, так это настроить ViewModel, чтобы содержать все данные для вашего приложения. Вы можете сериализовать и десериализовать эти данные с помощью IsolStorage, чтобы он сохранялся в сеансах приложений и при Tombstoning.

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

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

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

<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;
}

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

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(), который передает эту информацию в представление.

Ответ 6

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

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

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

Ответ 7

как я реализовал как это.. Является ли его правильным или нет, я не знаю..

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

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

 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);
    }

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

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

Ответ 8

Один из вариантов - использовать 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/ (автор: me)