我刚刚遇到WP7中臭名昭着的墓碑问题/问题。假设我有3个页面,FirstPage.xaml,SecondPage.xaml和ThirdPage.xaml。自然流动将是:
FirstPage.xaml - > SecondPage.xaml - > ThirdPage.xaml
换句话说,
主页 - >包含对象列表的页面 - >从上一页详细显示一个对象的页面
当我从FirstPage.xaml转到SecondPage.xaml时,我必须进行数据库查询才能在SecondPage.xaml中获取List。然后我需要从SecondPage.xaml转到ThirdPage.xaml(在我从List中选择一个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())中。
如果在一个实例(FirstPage.xaml - > SecondPage.xaml)中调用SecondPage.xaml.cs的构造函数,那么我的(有缺陷的)策略是,但在另一个实例中没有(ThirdPage.xaml - &gt ; SecondPage.xaml),然后我可以在构造函数中设置一个布尔标志,无论是进行新的数据库查询还是恢复页面的状态(来自PhoneApplication.Current.State)。 boolean标志最初设置为false,并且仅在SecondPage.xaml.cs的构造函数中设置为true。我认为这很好用,但是当我按下开始按钮离开应用程序然后点击后退按钮返回应用程序时,调用了SecondPage.xaml.cs的构造函数。所以我做了另一个新的数据库查询而不是恢复状态,这不是预期的行为。
我的问题是,当用户点击开始然后回到应用程序时,我怎么知道何时进行新的数据库查询与恢复?我想过如何自己解决这个问题,但我想到的大部分都是克拉德斯;这看起来很不自然,好像我正在努力让事情发挥作用。例如,我以为我可以将FirstPage.xaml中的查询字符串传递给SecondPage.xaml(即/SecondPage.xaml?freshDbQuery=1),但是当我从ThirdPage.xaml移回SecondPage.xaml时,该查询字符串键值对,freshDbQuery = 1,总是如此! (所以你可以说,我不太了解wp7)。
感谢任何帮助。
答案 0 :(得分: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
。