问题阐述:使用MVVMLight导航发现导航后VM里面的数据并未进行重置,需要界面跳转后,历史VM也进行销毁重置,并释放
解决办法:
方法一:在当前界面进行Unloaded进行VM注销并进行重新注入代码如下
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
问题阐述:使用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也将进行产生