0

我已经RichBox绑定到一个List<String>ListName在使用窗口中我在这个列表中添加了一些项目,但是在我关闭这个窗口并打开它之后我仍然有旧的添加名称,我知道当我没有处理视图模型时关闭窗口,但我在关闭时使用它

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

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

更新 :

用鲁迪回答我试着关闭做

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

它可以工作,但我似乎不适合取消注册虚拟机并重新注册!

4

2 回答 2

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);
  }
}

这样,每次向 VMLocator 查询Scan新 VM 时,都会在取消注册当前 VM 后返回。这种方法将符合“Laurent Bugnion”在这里提出的指导方针,我认为他非常了解自己的库,这样做不会出错。

我记得 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 和提供更大控制权的排序。是的,与 相比,Unity 是一种开销SimpleIoC,但这是该技术在需要时可以提供的,而不必自己编写代码。

于 2013-05-27T14:54:46.703 回答
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;
        }
    }
于 2013-05-27T14:10:17.453 回答