首页 > 其他分享 >解决MVVMLight导航VM不重置问题

解决MVVMLight导航VM不重置问题

时间:2022-12-22 14:35:31浏览次数:39  
标签:Parameters Default 重置 VM var MVVMLight SimpleIoc UnloadedCommand

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

解决办法:

方法一:在当前界面进行Unloaded进行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调用的方式为

 

 

 现在替换为

 

 

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

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

标签:Parameters,Default,重置,VM,var,MVVMLight,SimpleIoc,UnloadedCommand
From: https://www.cnblogs.com/ShyFrog/p/16998596.html

相关文章

  • 【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务
    前提介绍相信如果经历了我的上一篇Arthas的文章[【JVM实战系列】「监控调优体系」针对于Alibaba-Arthas的安装入门及基础使用开发实战指南]之后,相信你对Arthas的功能和使......
  • VUE项目中的CSS重置
    项目中的css重置,可以引用一个第三方库,以及手写一个css重置样式配合使用。一、首先安装normalize.cssnpminstall--savenormalize.css然后在main.ts中引入import'n......
  • JVM调优思路
    思路相关文章:​​JVM常用调优参数​​总结JVM调优不是一蹴而就:Step1.根据各种命令或监控软件,去收集现象Step2.根据现象去推理原因Step3.根据原因去修改JVM参数然后再重启......
  • JVM调优思路
    思路相关文章:JVM常用调优参数总结JVM调优不是一蹴而就:Step1.根据各种命令或监控软件,去收集现象Step2.根据现象去推理原因Step3.根据原因去修改JVM参数然后......
  • JVM常用调优参数
    目录JVM内存模型及常用参数参数解释垃圾收集器Serial收集器(-XX:+UseSerialGC-XX:+UseSerialOldGC)ParallelScavenge收集器(-XX:+UseParallelGC-XX:+UseParallelOldGC)P......
  • 内存溢出分析工具MAT实战(一)JVM启动参数分析
    在工作的过程中,有时我们会遇到内存溢出的问题,这时候就需要我们有足够的知识积累去解决内存溢出相关问题。本文章是建立在读者了解java的内存结构的基础上。关于内存分析工具......
  • VMware ESXi系统
    esxi全称“VMwareESXi”,是可直接安装在物理服务器上的强大的裸机管理系统,是一款虚拟软件,不需安装其他操作系统,是VMware服务器虚拟化的基础。通过直接访问并控制底层资源,VM......
  • jvm内存划分
    首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执......
  • VMware虚拟机出现"以独占方式锁定此配置文件失败,另一个正在运行的VMware进程可能正在
    VMware虚拟机出现"以独占方式锁定此配置文件失败,另一个正在运行的VMware进程可能正在使用配置文件"今天打开虚拟机一直启动不成功,关闭也关闭不掉,然后就强制结束进程。再次......
  • Java 特性、三大版本、JDK、JRE、JVM
    Java的特性 简单性面向对象可移植性writeonce,runanywhere高性能分布式动态性通过反射机制多线程安全性异常机制健壮性 *思考?j......