解决MVVMLight导航VM不重置问题

问题阐述:使用MVVMLight导航发现导航后VM里面的数据并未进行重置,需要界面跳转后,历史VM也进行销毁重置,并释放

解决办法:

方法一:在当前界面进行Unloaded进行VM注销并进行重新注入代码如下

解决MVVMLight导航VM不重置问题插图

解决MVVMLight导航VM不重置问题插图1解决MVVMLight导航VM不重置问题插图2

    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

View Code

解决MVVMLight导航VM不重置问题插图1解决MVVMLight导航VM不重置问题插图2


        "Unloaded">
            "{Binding UnloadedCommand}" />
        
    

View Code

解决MVVMLight导航VM不重置问题插图1解决MVVMLight导航VM不重置问题插图2

        private RelayCommand _UnloadedCommand;
        public RelayCommand UnloadedCommand =>
            _UnloadedCommand ?? (_UnloadedCommand = 
            new RelayCommand(ExecuteUnloadedCommand));

        void ExecuteUnloadedCommand()
        {
            SimpleIoc.Default.Unregister();
            SimpleIoc.Default.Register();
        }

View Code

方法二:对当前的VM获取方式进行做文章

处理思想:当界面在进行获取当前VM的时候创建新的VM就可以了

处理逻辑:封装一个方法,获取当前已经注册的VM然后进行封装转化创建出新的VM,创建过程中并将目标已有多个参数的构造参数进行二次转化封装

解决MVVMLight导航VM不重置问题插图1解决MVVMLight导航VM不重置问题插图2

        /// 
        /// 创建并转化新的VM不再使用原有已经注册的构造函数
        /// 
        /// 
        /// 
        private T CreateVM()
        {
            var newClass = SimpleIoc.Default.GetInstance();
            Type type = newClass.GetType();
            ConstructorInfo[] constructors = type.GetConstructors();
            var Parameters = constructors[0].GetParameters();
            object[] args = new object[Parameters.Length];
            for (int i = 0; i )
            {
                var data = SimpleIoc.Default.GetAllInstances(Parameters[i].ParameterType).FirstOrDefault();
                args[i] = data;
            }
            var vm = constructors[0].Invoke(args);
            return (T)vm;
        }

View Code

使用方法:原有的VM调用的方式为

解决MVVMLight导航VM不重置问题插图3

 

 

 现在替换为

解决MVVMLight导航VM不重置问题插图4

 

 

 替换完成后其他的正常使用

注意:使用的第二种方式的话,SimpleIoc.Default.GetInstance方法设置其他界面的VM将失效,选择使用,推荐第二种方式,这样做到了完全解耦,界面跳转VM进行销毁,新页面产生,新的VM也将进行产生

文章来源于互联网:解决MVVMLight导航VM不重置问题

THE END
分享
二维码