c# – 导航和重新调整页面/ viewmodel构造函数
我正在使用Galasoft Mvvm Light工具包,在
Windows手机的MVVM模式中构建我的应用程序.我必须每个页面都有自己的viewmodel.
当用户启动应用程序时,他可以选择新游戏og旋转问题页面.这些页面每个都有一个viewmodel,一切都使用viewmodellocator.然后,当用户再次导航以在新游戏和问题之间进行选择时.视图模型/页面未被删除.这意味着当用户第二次进入问题或新游戏时,不会调用viewmodel的构造函数,这样就不会运行构造函数中的初始化,并且未正确设置视图. 解决方案我试过了 我尝试删除导航中的后台堆栈,例如新游戏或问题的新导航,应该启动新页面,从而调用构造函数.不工作. 在视图中使用加载的事件,并调用构造函数.不工作. 试图跟随 有没有人解决这个问题,如果是这样,应该如何解决? 码 那么设置viewmodel的正确方法是什么.因为新游戏的视图将在重新加载旧游戏时使用,仅使用其他值,并且当想要开始新游戏时.希望你能理解 :) 此示例仅用于显示每次返回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结构以适应问题. 解决方法
ViewModelLocator的属性返回单例.要使属性每次只需编写时返回一个新实例:
private int questCount; public Question Quest { get { return ServiceLocator.Current.GetInstance<Question>((++questCount).ToString()); } } 但是,它将导致问题ViewModel缓存.您需要通过密切关注您链接的答案来释放未使用的ViewModel.这导致了我对太多代码的看法,以获得简单的结果.您可以使用其他IOC容器代替Windows Phone上的SimpleIoc(如ninject或unity),这可能更适合您的需求. 在一个简单的项目(几页应用程序)中,特别是在没有太多IOC容器经验的情况下,我建议你放弃所有的SimpleIoc连接,只需调用构造函数: public Question Quest { get { return new Question(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |