2011-07-13 101 views
1

我刚刚遇到了WP7中臭名昭着的墓碑问题/问题。比方说,我有3页,FirstPage.xaml,SecondPage.xaml和ThirdPage.xaml。自然流动将是:WP7中的墓碑问题,不知道是否需要恢复或实例化/查询新数据

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

换句话说

主页 - >与对象列表页面 - >页显示一个对象详细从前一页

当我从FirstPage.xaml到SecondPage.xaml,我必须做一个数据库查询来获得一个列表在SecondPage.xaml。然后我需要从SecondPage.xaml转到ThirdPage.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,并且只在SecondPage.xaml.cs的构造函数中设置为true。

我认为这工作得很好,但当我按下开始按钮离开应用程序,然后点击返回按钮返回到应用程序,SecondPage.xaml.cs的构造函数被调用。所以我做另一个新的数据库查询,而不是恢复状态,这不是预期的行为。

我的问题是,我怎么知道何时做一个新鲜的数据库查询vs恢复当用户点击开始,然后返回到应用程序?我想过如何自己解决这个问题,但我想到的大多数问题都是错误的;这似乎是不自然的,好像我正在修理让事情发挥作用。例如,我想我可以传递从FirstPage.xaml到SecondPage.xaml的查询字符串(即/SecondPage.xaml?freshDbQuery=1),但是当我从ThirdPage.xaml移回到SecondPage.xaml时,该查询字符串键值对,freshDbQuery = 1,总是如此! (所以你可以说,我不太了解wp7)。

任何帮助表示赞赏。

回答

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

+0

谢谢。直到今天早上,我再也没有重新讨论过这个问题(当时它再次困扰我)。它工作得很好。但它似乎很特别这个mvvm +墓碑组合。我明白mvvm,这实际上是一个很好的设计模式。然而,必须有一种更节制的状态(我的意思是整个状态;这意味着MVVM的ViewModel部分的view +模型)。有没有一个通用的框架来处理这个问题? – jake

+0

上面列出的方法适用于我的模拟器。然而,当我在真实设备上测试它时(按回家按钮,然后按下后退按钮),我所得到的只是一个页面,显示正在运行进度条的“恢复”。有任何想法吗? – jake

+0

@ user373312如果它“卡住”显示正在恢复,请检查VS是否正在等待您重新启动调试会话(F5) –