【问题标题】:How to manage the creation of instances when navigating导航时如何管理实例的创建
【发布时间】:2012-01-16 18:29:42
【问题描述】:

我正在编写遵循 MVVM 模式的 WP7 应用程序。

我有 ViewModelLocator,它确保 ViewModel 的每个实例只有一个。这些 ViewModel 是在应用程序启动时创建的。 ViewModel 使用消息相互通信。我使用导航到下一页的消息(为此,我使用 NavigationService.Navigate(),它是从 MainPage CodeBehind 引发的 - 它是 CodeBehind 中的唯一功能)。通过将 Page 中的 DataContext 设置为 ViewModelLocator,将 View 和 ViewModel 连接在一起。

一切一见钟情。

但是在每次导航期间,都会创建一个新的 Page 实例,该实例从 ViewModelLocator 连接到 ViewModel(这是为其设计的)。结果是:当用户经常在页面之间切换时,一个页面的多个实例连接到一个ViewModel。当然,在某一时刻只能看到一页。

非常简单的解决方案是设置 NavigationCache,但它在 WP7 中是只读的。

我正在寻找不良行为的解决方案。

【问题讨论】:

  • 在页面卸载函数中尝试将DataContext设置为Null,然后GC会更快地收集页面。

标签: mvvm navigation windows-phone-7.1


【解决方案1】:

每次导航到某个地方时,都会为该页面创建一个新实例。 您可以通过使用 NavigationService.GoBack(); 来避免这种情况。你可以在哪里。

您还应该在离开页面时从每个事件中注销,以便垃圾收集器可以清除该页面。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您可以尝试在 App.xaml.cs 中声明您的 ViewModel 的实例,例如,

    private static YourViewModel viewModel = null;
    public static YourViewModel ViewModel
    {
        get
        {
            // Delay creation of the view model until necessary
            if (viewModel == null)
                viewModel = ViewModelLocator.MainStatic;
    
            return viewModel;
        }
    }
    

    然后从您将导航到的页面中,您可以将其引用为 App.ViewModel。

    如果您的页面与主应用程序不同,您可以在 App.xaml 中声明以下内容,

    <vm:ViewModelLocator x:Key="VMLocator" />
    

    其中 vm 引用你的主应用程序,那么你可以使用如下,

    ((ViewModelLocator)Application.Current.Resources["VMLocator"]).YourViewModel;
    

    希望它会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2012-12-02
      相关资源
      最近更新 更多