1

WP7 で悪名高いトゥームストーンの問題/問題に遭遇しました。FirstPage.xaml、SecondPage.xaml、ThirdPage.xaml の 3 つのページがあるとします。自然の流れは次のようになります。

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

言い換えると、

メインページ -> オブジェクトのリストがあるページ -> 前のページから 1 つのオブジェクトを詳細に表示するページ

FirstPage.xaml から SecondPage.xaml に移動すると、データベース クエリを実行して SecondPage.xaml のリストを取得する必要があります。次に、SecondPage.xaml から ThirdPage.xaml に移動する必要があります (リストから MyObject を 1 つ選択した後)。この時点で、トゥームストーンは私にとって非常にややこしいものになりつつあります。

FirstPage.xaml -> SecondPage.xaml に行くと、SecondPage.xaml.cs のコンストラクターが呼び出されます。私は、ThirdPage.xaml -> SecondPage.xaml (戻るボタンまたは NavigationService.GoBack() を押して戻る) に行くときに、SecondPage.xaml.cs のコンストラクターが呼び出されないことを知っています。SecondPage.xaml から ThirdPage.xaml に移動するとき、View-Model (VM) オブジェクトを PhoneApplicationService.Current.State (SecondPage.xaml.cs.OnPageNavigatedFrom()) に格納します。

私の(欠陥のある)戦略は、SecondPage.xaml.csのコンストラクターが1つのインスタンス(FirstPage.xaml -> SecondPage.xaml)で呼び出され、他のインスタンス(ThirdPage.xaml -> SecondPage.xaml)では呼び出されない場合でした。 、その後、新しい DB クエリを実行するか、ページの状態を (PhoneApplication.Current.State から) 復元するかどうか、コンストラクターでブール値のフラグを設定できます。ブール フラグは最初に false に設定され、SecondPage.xaml.cs のコンストラクターでのみ true に設定されます。

これでうまくいくと思ったのですが、スタート ボタンを押してアプリを終了し、戻るボタンを押してアプリに戻ると、SecondPage.xaml.cs のコンストラクターが呼び出されました。そのため、意図した動作ではない状態を復元する代わりに、別の新しい DB クエリを実行します。

私の質問はこれです。ユーザーが開始を押してアプリに戻るときに、新しい DB クエリと復元をいつ実行するかをどのように知ることができますか? 私はこれを自分で解決する方法を考えましたが、私が考えたもののほとんどはクラッジでした。それは不自然に見え、物事を機能させるためにいじくり回しているように見えました. たとえば、FirstPage.xaml から SecondPage.xaml (つまり、/SecondPage.xaml?freshDbQuery=1) にクエリ文字列を渡すことができると思っていましたが、ThirdPage.xaml から SecondPage.xaml に戻ると、そのクエリ文字列のキー値ペア、freshDbQuery=1 は常にそうです! (お分かりのように、私は wp7 をよく知りません)。

どんな助けでも大歓迎です。

4

1 に答える 1

2

トゥームストーニングのすべての処理は、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可能な限りこれを優先して使用してください。

于 2011-07-13T08:37:23.110 に答える