【问题标题】:WP7 - Why are my bindings not firing when the windows back button is pressed?WP7 - 为什么按下 Windows 后退按钮时我的绑定没有触发?
【发布时间】:2011-01-22 16:16:09
【问题描述】:

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

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

但是,如果我使用导航方法通过代码返回 MainPage,则绑定将重新评估并且一切正常。

关于为什么的任何想法?

【问题讨论】:

    标签: data-binding windows-phone-7 mvvm-light back-button


    【解决方案1】:

    这个问题听起来像是您的 MVVM Light ViewModel 没有引发 RaisePropertyChanged 方法 - 如果您将 ViewModel 上 IsEnabled 属性的 Get{} 访问器直接绑定到 IsolatedStorage 中的值,则 ViewModel 不是会知道潜在价值必然发生了变化。

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

    【讨论】:

    • 嗯,这是我要尝试的第一件事,因为基本上我需要将 RaisePropertyChanged 从不同的 ViewModel 更改为需要它的 ViewModel。我没有,因为导航有效,而后退按钮没有,加上我没有像标准 MVVM-light 实现那样保留我的 ViewModel,所以我认为它不会在那里接收消息。我会试一试,让你知道
    • 好的,但它给我留下了更多问题。通过代码导航到视图会调用我的 ViewModel 的构造函数,而通过后退按钮则不会。为什么是这样? WP7 是否以某种方式保留了对我的视图和 ViewModel 的引用?如果是这样,当视图导航离开时如何处理 ViewModel,这样我就不会在内存中保留大量集合?
    • 按下后退按钮似乎会按原样弹出原始视图。当按下后退按钮时,我的 ViewModelLocator 公开 ViewModel 属性甚至没有被击中。
    • 传统 MVVM Light 实现中的所有 ViewModel 都是静态的。它们只会在每个应用程序中初始化一次,除非您对 ViewModelLocator 进行了一些重大更改或根本不使用它。
    • 后台堆栈的工作方式是它会尝试从缓存中提取页面的 VisualState,因此它不一定会适当地重新触发所有绑定。如果默认的回栈行为导致一些问题,您可以处理回栈事件并手动驱动视图中的一些绑定行为。使用 messenger 界面弹出绑定/导航事件是一种相对简单的方法。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多