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

  • Вопрос

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

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

     

    12 января 2012 г. 20:49

Ответы

  • 1. Можно создать какой-нибудь свой класс и сделать в нем статическое поле:

     

        public class MyHelper
        {
            public static string MyVal
            {
                get;
                set;
            }
        }
    

    И затем обращаться к ней

    MyHelper.MyVal = "";

    2. Можно объявить так же переменную в App.xaml.cs, тогда к ней будет доступ из любой страницы:

    App.MyVal;

    • Помечено в качестве ответа ZEONE 14 января 2012 г. 15:18
    13 января 2012 г. 6:59
  • http://www.eugenedotnet.com/2011/07/passing-values-between-windows-phone-7-pages-current-context-of-application/
    Ещё вариант - использовать изолированное хранилище: http://pugachev.info/archives/569, в частности
    IsolatedStorageSettings.ApplicationSettings
    • Изменено Anton.Maksimov 13 января 2012 г. 7:05
    • Помечено в качестве ответа ZEONE 14 января 2012 г. 15:18
    13 января 2012 г. 7:02

Все ответы

  • 1. Можно создать какой-нибудь свой класс и сделать в нем статическое поле:

     

        public class MyHelper
        {
            public static string MyVal
            {
                get;
                set;
            }
        }
    

    И затем обращаться к ней

    MyHelper.MyVal = "";

    2. Можно объявить так же переменную в App.xaml.cs, тогда к ней будет доступ из любой страницы:

    App.MyVal;

    • Помечено в качестве ответа ZEONE 14 января 2012 г. 15:18
    13 января 2012 г. 6:59
  • http://www.eugenedotnet.com/2011/07/passing-values-between-windows-phone-7-pages-current-context-of-application/
    Ещё вариант - использовать изолированное хранилище: http://pugachev.info/archives/569, в частности
    IsolatedStorageSettings.ApplicationSettings
    • Изменено Anton.Maksimov 13 января 2012 г. 7:05
    • Помечено в качестве ответа ZEONE 14 января 2012 г. 15:18
    13 января 2012 г. 7:02
  • Хотел бы уточнить, что именно вы хотите, т.к. в указанном уроке никаких страниц не увидел.

    Вы хотите открывать более подробно одну из новостей, но не запрашивать ее данные повторно, верно? По крайней мере те данные, что уже получены.

    Но ведь судя по уроку, эти данные уже хранятся у вас в хранилище, что мешает , открывая вторую страницу, считать их оттуда?

     

    Может вам поможет мой пример. Он не связан с тем, как реализованно в уроке - я не использую хранилище (по задумке приложения это не нужно).

    Классическая структура Model-View - поулчаемые данные хранятся в модели, а View их дергает, когда ему надо.

    У меня запрашивается лента сообщений. Для экономии траффика, запрашиваю с сервера не полные данные, а только часть.

    Данные сохраняются в коллекции, откуда биндятся(binding) прямо на страницу.

     

    При выборе элемента листа, я копирую указатель на элемент коллекции, а указатель статически хранится в App классе

    Имена переменных "говорящие", поэтому мне лень комментировать ху из ху, надеюсь будет понятно

    App.XAML.cs
    
        public partial class App : Application
        {
            public static Model.OneEntryData single_post;
        ....
        }
    
    ----------------------
    LentaPage.XAML.cs
    
        public partial class LentaPage : PhoneApplicationPage
        {
        ...................
            private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (e.AddedItems.Count > 0)
                {
                    // prepare data for single post page
                    ListBox listblk = (ListBox)sender;
                    int nSelectedIndex = listblk.SelectedIndex;
    
                    // reset selected index
                    listblk.SelectedIndex = -1;
    
    ///// вот здесь я сохраняю указатель на элемент в коллекции и новая страница через него работает с уже полученными данными
                    App.single_post = lentaModel.EntriesLenta[nSelectedIndex];
    
                    // go to Single Post Page
                    this.NavigationService.Navigate(...);
                }
            }
    
        .........
        }
    
    

     

    А в классе второй страницы мне уже ничего делать не надо - ее поля биндятся к этому SinglePost (ну, вернее делается - я все же запрашиваю полные данные. Но пока они не получены, пользователь может видеть Заголовок, время получения, урезанное тело сообщения и т.п. - то, что было получено для ленты)



    • Изменено ealexash 13 января 2012 г. 7:05
    13 января 2012 г. 7:02
  • protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        YourClass page2Instance = e.Content as Page2;
        if (page2Instance != null)
        {
            page2Instance.Parameter = "value";
        }
    }
    

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

    13 января 2012 г. 8:21
  • Спасибо большое что откликнулись 8) даже не ожидал что ответов будет так много. Особенно после ветки АСП.НЕТ (хотя может то просто такие вопросы были 8) ). Сейчас попробую какой то из методов представленых вами. 8)

     

    2 ealexash

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

    14 января 2012 г. 12:34
  • Ответ от Filipp Panfilov - очень хороший, фактически это что-то вроде глобальных переменных. Насчёт использования изолированного хранилища не совсем согласен - изолированное хранилище рекомендуется использовать для постоянного хранения каких-либо данных и не рекомендуется для хранения каких-то часто обновляемых (предполагается, что данные сразу записываются на постоянный носитель - флэш-карту. По-крайней мере скорость доступа там должна быть ниже).
    14 января 2012 г. 14:01
  • Ответ от Filipp Panfilov - очень хороший, фактически это что-то вроде глобальных переменных. Насчёт использования изолированного хранилища не совсем согласен - изолированное хранилище рекомендуется использовать для постоянного хранения каких-либо данных и не рекомендуется для хранения каких-то часто обновляемых (предполагается, что данные сразу записываются на постоянный носитель - флэш-карту. По-крайней мере скорость доступа там должна быть ниже).

    Согласен, я правда сделал по ссылке которую мне указал Anton.Maksimov но о сути это одно и тоже 8) Думаю тут все посты за ответ можно принять 8)


     

    14 января 2012 г. 15:20
  • IsolatedStorageSettings.ApplicationSettings были одним из вариантов хранения данных. По поводу записи в файл сразу - насколько я знаю, настройки сохраняются в файл только по Save или по выходу из приложения.

    P.S. я согласен с тем, что эти настройки предназначены больше для сохранения состояний не между страницами, а между сеансами. Они будут как нельзя кстати при передаче между страницами, если эти данные нужно будет так же сохранять и между сеансами.

    14 января 2012 г. 16:48