解决MVVMLight导航VM不重置问题

时间:2022-12-22 15:10:45

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

解决办法:

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

解决MVVMLight导航VM不重置问题

    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
View Code
<i:Interaction.Triggers>
        <i:EventTrigger EventName="Unloaded">
            <i:InvokeCommandAction Command="{Binding UnloadedCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
View Code
        private RelayCommand _UnloadedCommand;
        public RelayCommand UnloadedCommand =>
            _UnloadedCommand ?? (_UnloadedCommand = 
            new RelayCommand(ExecuteUnloadedCommand));

        void ExecuteUnloadedCommand()
        {
            SimpleIoc.Default.Unregister<MainWindowViewModel>();
            SimpleIoc.Default.Register<MainWindowViewModel>();
        }
View Code

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

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

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

        /// <summary>
        /// 创建并转化新的VM不再使用原有已经注册的构造函数
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        private T CreateVM<T>()
        {
            var newClass = SimpleIoc.Default.GetInstance<T>();
            Type type = newClass.GetType();
            ConstructorInfo[] constructors = type.GetConstructors();
            var Parameters = constructors[0].GetParameters();
            object[] args = new object[Parameters.Length];
            for (int i = 0; i < Parameters.Length; 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不重置问题

 

 

 现在替换为

解决MVVMLight导航VM不重置问题

 

 

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

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

相关文章