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

Mvvm 如何在导航时管理实例的创建,mvvm,navigation,windows-phone-7.1,Mvvm,Navigation,Windows Phone 7.1,我正在按照MVVM模式编写WP7应用程序 我有一个ViewModelLocator,它确保ViewModel的每个实例只有一个。这些视图模型是在应用程序启动时创建的。ViewModels使用消息相互通信。我使用消息导航到下一页(为此,我使用NavigationService.Navigate(),它是从MainPage CodeBehind中提出的-这是CodeBehind中唯一的功能)。通过将页面中的DataContext设置为ViewModelLocator,可以将View和ViewMode

我正在按照MVVM模式编写WP7应用程序

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

一切一见钟情

但在每次导航过程中,都会创建新的页面实例,该实例通过ViewModelLocator(专为其设计)连接到ViewModel。结果是:当用户经常在页面之间切换时,一个页面的多个实例连接到一个ViewModel。当然,在一个点上只有一页是可见的

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


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

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

当导航离开页面时,还应该注销每个事件,以便垃圾收集器可以清除该页面


我希望这会有所帮助。

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

希望能有帮助

在PageUnload函数中,尝试将DataContext设置为Null,然后GC将更快地收集页面。
((ViewModelLocator)Application.Current.Resources["VMLocator"]).YourViewModel;