如何在导航时管理实例的创建

时间:2012-01-16 18:29:42

标签: mvvm navigation windows-phone-7.1

我正在编写坚持MVVM模式的WP7应用程序。

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

Everythig一见钟情。

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

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

我正在寻找不受欢迎行为的解决方案。

2 个答案:

答案 0 :(得分:0)

每次在某处导航时,都会为该页面创建一个新实例。 您可以通过使用NavigationService.GoBack();你可以在哪里。

当您离开页面时,您还应该从每个事件中取消注册,这样垃圾收集器就可以清除该页面。

我希望这会有所帮助。

答案 1 :(得分:0)

您可以尝试在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;

希望它会有所帮助。