5

我使用MVVM Light 框架制作了一个 C# WPF 应用程序。我的应用程序使用ViewModelLocator该类在运行时定位视图模型。使用MVVM Light 框架附带ViewModelLocator的类。SimpleIoc

这是我的场景:用户登录可以使用我的应用程序。注销时,我想处置/重置/重新创建所有视图模型实例,为下一个用户提供一个干净的环境。

我试图Cleanup()在类中实现该方法,ViewModelLocator但它不起作用。不工作意味着(第二个)用户看到之前登录的用户的数据。

第一次尝试:

public static void Cleanup()
{
   SimpleIoc.Default.Reset();
}

第二次尝试:

public static void Cleanup()
{
   SimpleIoc.Default.Unregister<LoginViewModel>();
   SimpleIoc.Default.Unregister<TaskViewModel>();

   SimpleIoc.Default.Register<LoginViewModel>();
   SimpleIoc.Default.Register<TaskViewModel>();
}

第三次尝试(不是我想要的,但它是一种解决方法):

public static void Cleanup()
{
   // I implemented the ICleanup interface in my viewmodels
   // The cleanup method clears all my variables eg: myCollection.clear();
   SimpleIoc.Default.GetInstance<LoginViewModel>().Cleanup();
   SimpleIoc.Default.GetInstance<TaskViewModel>().Cleanup();
}

如何重置ViewModelLocator班级中的所有实例?如有必要,我愿意使用更高级的 Ioc Container。

4

1 回答 1

4

SimpleIoC

我会添加一个带有私有字符串后端的公共静态属性,以获得唯一的Key

就像是

private static string _currentKey = System.Guid.NewGuid().ToString();
public static string CurrentKey {
  get {
    return _currentKey;
  }
  private set {
    _currentKey = value;
  }
}

并使用清理方法使用当前密钥取消注册 VM,最后重置当前密钥(在每个应用程序重置阶段调用):

public static void Cleanup() {
  SimpleIoc.Default.Unregister<LoginViewModel>(CurrentKey);
  ...
  CurrentKey = System.Guid.NewGuid().ToString();
}

并且在调用时GetInstance(...)只需传入 static CurrentKey

SimpleIoc.Default.GetInstance<LoginViewModel>(ViewModelLocator.CurrentKey);
于 2013-06-11T12:28:30.190 回答