关闭窗口时清理ViewModel中的所有项目

时间:2013-05-27 13:56:08

标签: c# wpf mvvm-light resource-cleanup

我在使用窗口时RichBox绑定到List<String>ListName我在此列表中添加了一些项目,但在关闭此窗口后我打开它仍然有旧的添加名称,我知道关闭窗口时不会处理View模型,但我在关闭时使用它

public virtual void Cleanup()
{
    this.MessengerInstance.Unregister(this);
}

但这只会清除Messenger并让我的所有其他项目都有值,我想在关闭窗口时清除此ViewModel中的所有资源

更新:

与Rudi回答我试着关闭做

SimpleIoc.Default.Unregister<ScanViewModel>();
SimpleIoc.Default.Register<ScanViewModel>();

并且它可以正常工作,但是取消注册VM并再次注册它似乎不合适!

2 个答案:

答案 0 :(得分:2)

如果需要,您可以取消注册该类的实例,而不是删除整个类。

来自SimpleIoc.cs的片段:

//
// Summary:
//     Removes the instance corresponding to the given key from the cache. The class
//     itself remains registered and can be used to create other instances.
//
// Parameters:
//   key:
//     The key corresponding to the instance that must be removed.
//
// Type parameters:
//   TClass:
//     The type of the instance to be removed.
public void Unregister<TClass>(string key) where TClass : class;

请注意,在SimpleIoC的每个决议中获取该课程的新实例,我们需要在GetInstance()

中指定一个唯一的关键字

所以在ViewModelLocator.cs中保留对currentKey使用的引用,并在下次尝试时取消注册,例如:

private string _currentScanVMKey;
public ScanViewModel Scan
{
  get {
    if (!string.IsNullOrEmpty(_currentScanVMKey))
      SimpleIoc.Default.Unregister(_currentScanVMKey);
    _currentScanVMKey = Guid.NewGuid().ToString();
    return ServiceLocator.Current.GetInstance<ScanViewModel>(_currentScanVMKey);
  }
}

这样,每次在Scan查询VMLocator时,都会在取消注册当前VM后返回新VM。这种方法符合“Laurent Bugnion”Here建议的指导方针,并且我认为它非常了解自己的库,并且你不会这样做。

我记得MVVM Light的作者状态SimpleIoC旨在让开发人员熟悉IOC原则并让他们自己探索它。这对于简单的项目来说非常棒,如果你确实想要对你的VM注入进行越来越多的控制,那么我建议你查看Unity这样的事情,你可以很容易地解决你当前的情况。

// _container is a UnityContainer
_container.RegisterType<ScanViewModel>();  // Defaults to new instance each time when resolved
_container.RegisterInstance<ScanViewModel>();  // Defaults to a singleton approach

您还可以获得LifeTimeManagers和各种更好的控制。是的,与SimpleIoC相比,Unity是一种开销,但这是技术在需要时可以提供的,而不是自己编写代码。

答案 1 :(得分:0)

我想这会做到这一点:

SimpleIoc.Default.Unregister<ViewModelName>();

编辑:这个怎么样

    public ViewModelName MyViewModel
    {
        get
        {
            ViewModelName vm = ServiceLocator.Current.GetInstance<ViewModelName>();
            SimpleIoc.Default.Unregister<ViewModelName>();
            //or SimpleIoc.Default.Unregister<ViewModelName>(MyViewModel);
            return vm;
        }
    }