Mvvm 如何在导航时管理实例的创建
我正在按照MVVM模式编写WP7应用程序 我有一个ViewModelLocator,它确保ViewModel的每个实例只有一个。这些视图模型是在应用程序启动时创建的。ViewModels使用消息相互通信。我使用消息导航到下一页(为此,我使用NavigationService.Navigate(),它是从MainPage CodeBehind中提出的-这是CodeBehind中唯一的功能)。通过将页面中的DataContext设置为ViewModelLocator,可以将View和ViewModels连接在一起 一切一见钟情 但在每次导航过程中,都会创建新的页面实例,该实例通过ViewModelLocator(专为其设计)连接到ViewModel。结果是:当用户经常在页面之间切换时,一个页面的多个实例连接到一个ViewModel。当然,在一个点上只有一页是可见的 非常简单的解决方案可以是设置NavigationCache,但它在WP7中是只读的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
我正在寻找不必要行为的解决方案。每次导航到某个地方时,都会为该页面创建一个新实例。 您可以通过使用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;