проблемы с надгробием в WP7, не могу сказать, если мне нужно восстановить или создать / запросить новые данные - PullRequest
1 голос
/ 13 июля 2011

Я только что столкнулся с печально известной проблемой / проблемой в WP7. скажем, у меня есть 3 страницы, FirstPage.xaml, SecondPage.xaml и ThirdPage.xaml. естественный поток будет:

FirstPage.xaml -> SecondPage.xaml -> ThirdPage.xaml

другими словами,

главная страница -> страница со списком объектов -> страница, подробно отображающая один объект с предыдущей страницы

когда я перехожу из FirstPage.xaml в SecondPage.xaml, мне нужно выполнить запрос к базе данных, чтобы получить список в SecondPage.xaml. Затем мне нужно перейти к ThirdPage.xaml из SecondPage.xaml (после того, как я выберу один MyObject из списка). в этот момент надгробие становится очень запутанным для меня.

Я знаю, что при переходе FirstPage.xaml -> SecondPage.xaml вызывается конструктор SecondPage.xaml.cs. я знаю, что при переходе в ThirdPage.xaml -> SecondPage.xaml (возвращаясь назад, нажимая кнопку «Назад» или NavigationService.GoBack ()), конструктор SecondPage.xaml.cs НЕ вызывается. когда я перехожу из SecondPage.xaml в ThirdPage.xaml, я сохраняю объекты модели представления (VM) в PhoneApplicationService.Current.State (SecondPage.xaml.cs.OnPageNavigatedFrom ()).

моя (ошибочная) стратегия была, ну, если конструктор SecondPage.xaml.cs вызывается в одном экземпляре (FirstPage.xaml -> SecondPage.xaml), но не в другом экземпляре (ThirdPage.xaml -> SecondPage .xaml), тогда я могу установить логический флаг в конструкторе, делать ли новый запрос к БД или восстанавливать состояние страницы (из PhoneApplication.Current.State). логический флаг изначально имеет значение false и устанавливается только в true в конструкторе SecondPage.xaml.cs.

Я думал, что это сработало хорошо, но затем, когда я нажал кнопку «Пуск», чтобы выйти из приложения, а затем нажал кнопку «Назад», чтобы вернуться в приложение, был вызван конструктор SecondPage.xaml.cs. поэтому я делаю еще один свежий запрос к БД вместо восстановления состояния, которое НЕ является предполагаемым поведением.

У меня такой вопрос: как узнать, когда выполнить новый запрос к БД против восстановления, когда пользователь нажимает кнопку «Пуск», а затем обратно, чтобы попасть в приложение? я думал о том, как решить это сам, но большинство из того, что я придумал, были клуджес; это казалось неестественным и как будто я возился, чтобы заставить вещи работать. например, я подумал, что могу передать строку запроса из FirstPage.xaml в SecondPage.xaml (т.е. /SecondPage.xaml?freshDbQuery=1), но когда я перехожу из ThirdPage.xaml обратно в SecondPage.xaml, это значение ключа строки запроса pair, freshDbQuery = 1, всегда так! (как вы можете сказать, я не очень хорошо знаю wp7).

любая помощь приветствуется.

1 Ответ

2 голосов
/ 13 июля 2011

Вся ваша обработка надгробий должна выполняться в событиях OnNavigatingFrom** и OnNavigatedTo.

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

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    if (e.NavigationMode != System.Windows.Navigation.NavigationMode.Back)
    {
        this.State.Clear();
        this.State.Add("db_data", ***Serialized version of the DB returned data***);
    }

    base.OnNavigatingFrom(e);
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (this.State.ContainsKey("db_data"))
    {
        this.SomethingOnPage = DeserializeToAppropriateType(this.State["db_data"]);
    }

    base.OnNavigatedTo(e);
}

** Используйте это вместо OnNavigatedFrom, где это возможно.

...