解决MVVMLight导航VM不重置问题
问题阐述:使用MVVMLight导航发现导航后VM里面的数据并未进行重置,需要界面跳转后,历史VM也进行销毁重置,并释放
解决办法:
方法一:在当前界面进行Unloaded进行VM注销并进行重新注入代码如下

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

<i:Interaction.Triggers> <i:EventTrigger EventName="Unloaded"> <i:InvokeCommandAction Command="{Binding UnloadedCommand}" /> </i:EventTrigger> </i:Interaction.Triggers>

private RelayCommand _UnloadedCommand; public RelayCommand UnloadedCommand => _UnloadedCommand ?? (_UnloadedCommand = new RelayCommand(ExecuteUnloadedCommand)); void ExecuteUnloadedCommand() { SimpleIoc.Default.Unregister<MainWindowViewModel>(); SimpleIoc.Default.Register<MainWindowViewModel>(); }
方法二:对当前的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; }
使用方法:原有的VM调用的方式为
现在替换为
替换完成后其他的正常使用
注意:使用的第二种方式的话,SimpleIoc.Default.GetInstance方法设置其他界面的VM将失效,选择使用,推荐第二种方式,这样做到了完全解耦,界面跳转VM进行销毁,新页面产生,新的VM也将进行产生
分类:
WPF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义