我在使用窗口时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并再次注册它似乎不合适!
答案 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;
}
}