我正在编写坚持MVVM模式的WP7应用程序。
我有ViewModelLocator,它确保ViewModel的每个实例只有一个。启动应用程序时会创建这些ViewModel。 ViewModels使用消息相互通信。我使用消息导航到下一页(为此我使用的是NavigationService.Navigate(),它是从MainPage CodeBehind引发的 - 它是CodeBehind中唯一的功能)。通过将PageIn中的DataContext设置为ViewModelLocator,将View和ViewModel连接在一起。
Everythig一见钟情。
但是在每次导航期间,都会创建一个新的Page实例,它从ViewModelLocator(专为此设计)连接到ViewModel。结果是:当用户经常在页面之间切换时,有一个页面的多个实例连接到一个ViewModel。当然,一次只能看到一页。
非常简单的解决方案可能是设置NavigationCache,但它只是在WP7中读取。
我正在寻找不受欢迎行为的解决方案。
答案 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;
希望它会有所帮助。