Data binding WP7-为什么我的绑定在按下windows后退按钮时没有启动?

Data binding WP7-为什么我的绑定在按下windows后退按钮时没有启动?,data-binding,windows-phone-7,mvvm-light,back-button,Data Binding,Windows Phone 7,Mvvm Light,Back Button,希望有一个明显的答案,我凌晨2点的大脑看不到(我是基于这个事实,我找不到其他人有同样的问题) 当我按下windows phone 7上的“硬件/内置”后退按钮时,没有任何绑定正在重新评估。例如,在我的主页上,我有一个按钮的“IsEnabled”绑定到我的ViewModel中的bool属性,该属性检查值是否在独立存储中。在模拟器中,它以禁用状态启动(显然)。然后,我导航到另一个页面,将所需的值添加到独立存储中。当我按下hardware back(硬件返回)按钮返回到原始页面时,绑定不会得到重新评估

希望有一个明显的答案,我凌晨2点的大脑看不到(我是基于这个事实,我找不到其他人有同样的问题)

当我按下windows phone 7上的“硬件/内置”后退按钮时,没有任何绑定正在重新评估。例如,在我的主页上,我有一个按钮的“IsEnabled”绑定到我的ViewModel中的bool属性,该属性检查值是否在独立存储中。在模拟器中,它以禁用状态启动(显然)。然后,我导航到另一个页面,将所需的值添加到独立存储中。当我按下hardware back(硬件返回)按钮返回到原始页面时,绑定不会得到重新评估,我的按钮仍处于禁用状态

然而,如果我使用导航方法通过代码返回主页,绑定将得到重新评估,一切都很好


你知道为什么吗

这个问题听起来像MVVM Light ViewModel没有提出RaisePropertyChanged方法-如果您将ViewModel上IsEnabled属性的Get{}访问器直接绑定到IsolatedStorage中的值,那么ViewModel就不会知道基础值已经发生了必要的更改


当您将值写入IsolatedStorage时,您可以使用MVVM中的Messenger接口通知相关的ViewModel,它应该为您的模型触发RaisePropertyChanged()事件,这将在您的视图中重新绑定该属性。

当您使用
NavigationService.Navigate
方法时,实际上,您正在执行正向导航,并创建了页面的新实例。按下硬件后退按钮时,将执行向后导航,并重新显示上一页。几乎所有时候,您都会得到页面原始实例的缓存版本


您可以重新评估
OnNavigatedTo
override中的任何绑定,以覆盖页面,但这会引入相当多的“代码味道”。如上所述,使用
Messenger
将使您能够更新关联的视图模型,这将更新页面上的绑定。

Hmmm这是我要尝试的第一件事,因为基本上我需要提高性能,从不同的视图模型更改为需要它的视图模型。我没有这样做,因为导航功能正常,而后退按钮不起作用,而且我没有像标准MVVM light实现中那样保留ViewModels,所以我认为它不会在那里接收消息。我会尝试一下,让你知道这是可行的,但这给我留下了更多的问题。通过代码导航到视图会调用我的ViewModel的构造函数,而通过“后退”按钮则不会。为什么会这样?WP7是否以某种方式保留了对我的视图和视图模型的引用?如果是这样的话,当视图被导航到其他位置时,如何处理ViewModel,这样我就不会在内存中保留大量的集合?按“上一步”按钮似乎只会按原样弹出原始视图。当按下“后退”按钮时,甚至没有点击显示ViewModel的My ViewModelLocator属性。传统MVVM Light实现中的所有ViewModel都是静态的。每个应用程序只初始化一次,除非您对ViewModelLocator进行了一些重大更改或根本不使用它。后堆栈的工作方式是,它将尝试从缓存中提取页面的VisualState,因此不必适当地重新定义所有绑定。如果默认的后堆栈行为导致某些问题,则可以处理后堆栈事件并手动驱动视图中的某些绑定行为。使用messenger界面弹出绑定/导航事件是一种相对简单的方法。