我正在使用Galasoft Mvvm Light工具包,在Windows手机的MVVM模式中构建我的应用程序。我必须有每个都有自己的viewmodel的页面。
当用户启动应用程序时,他可以选择新游戏og旋转问题页面。这些页面每个都有一个viewmodel,一切都使用viewmodellocator。然后,当用户再次导航以在新游戏和问题之间进行选择时。视图模型/页面未被删除。这意味着当用户第二次进入问题或新游戏时,不会调用viewmodel的构造函数,这样就不会运行构造函数中的初始化,并且视图设置不正确。
我尝试过的解决方案
我尝试删除导航中的backstack,例如新游戏或问题的新导航,应该启动新页面,从而调用构造函数。不工作。
在视图中使用已加载的事件,并调用构造函数。不工作。
试图跟随 How to reset all instances in IOC Container 但无法让它发挥作用,可能只是我。
有没有人解决这个问题,如果有的话应该如何解决?
代码 在这里你可以找到一个例子。按问题,然后按一下那里的按钮,使用返回键。并再次按下问题。你看到这个数字现在是1,这很容易改变。但是再次按下按钮时会出现错误。突然出现了两个弹出窗口。
那么设置viewmodel的正确方法是什么。因为新游戏的视图将在重新加载旧游戏时使用,仅与其他值一起使用,并且当想要开始新游戏时。希望你理解:)
此示例仅用于显示每次返回viewmodel页面时弹出窗口计数上升的问题。 https://www.dropbox.com/s/gjbz0l8rmsxqzrd/PhoneApp8.rar
ViewModel定位器 我在当前的项目中使用了以下代码中的三个viewmodel:
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;
namespace MVVMTestApp.ViewModel
{
public class ViewModelLocator
{
public ViewModelLocator()
{
//Holder styr på ViewModels
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
//Tilføj linje her for hver ViewModel
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<MainViewModelTest>();
SimpleIoc.Default.Register<MenuViewModel>();
}
//Tilføj metode som denne for hver ViewModel
public MainViewModel Map
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
public MainViewModelTest Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModelTest>();
}
}
public MenuViewModel Menu
{
get
{
return ServiceLocator.Current.GetInstance<MenuViewModel>();
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
我已经查看了上面引用的链接,重置了IOC容器中的所有实例。但是不确定密钥是如何工作的,以及如何确保在远离视图时调用清理函数。因为我不想同时清理所有的视图模型。
导航和viewmodelbinding
我将viewmodel绑定到视图
DataContext="{Binding Source={StaticResource Locator},Path=Map}"
我使用NavigationService和backbutton来回导航。从菜单到游戏:
NavigationService.Navigate(new Uri("/View/MainPage.xaml", UriKind.Relative));
并在页面中
protected override void OnNavigatedTo(NavigationEventArgs e)
{
//e.Content = NavigationMode.New;
//e.NavigationMode = NavigationMode(
ViewModel.MainViewModel test = new ViewModel.MainViewModel();
GC.Collect();
base.OnNavigatedTo(e);
}
从游戏到菜单:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
//e.NavigationMode = NavigationMode.
this.DataContext = null;
GC.Collect();
base.OnNavigatedFrom(e);
//test = null;
}
在菜单中我调用了垃圾收集器。可以看出,我打破了MVVM结构以适应问题。