Очистить все элементы в ViewModel при закрытии окна

Я имею RichBox привязан к List<String>ListName при использовании окна я добавляю какой-то элемент в этот список, но после того, как я закрываю это окно и открываю его, у меня остается старое добавленное имя, я знаю, что модель View не удаляется при закрытии окна, но я используйте это при закрытии

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

но это будет чистить только Messenger и пусть все мои другие элементы со значениями, я хочу очистить все ресурсы в этой модели представления при закрытии окна

Обновить:

с ответом руди я пытаюсь на закрытие делать

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

и это работает, но мне кажется неправильным отменить регистрацию виртуальной машины и зарегистрировать ее снова!

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 новая виртуальная машина возвращается после отмены регистрации текущей виртуальной машины. Этот подход будет соответствовать рекомендациям, предложенным "Лораном Бюньоном" Здесь, и я бы понял, что он хорошо знает свои собственные библиотеки, и вы не ошибетесь, сделав это таким образом.

Я помню где-то авторское состояние MVVM Light SimpleIoC было предназначено для ознакомления разработчиков с принципами МОК и позволить им изучить его для себя. Это отлично подходит для простых проектов. Если вы хотите все больше и больше контролировать свои инъекции ВМ, то я бы посоветовал взглянуть на такие вещи, как Unity, в которых ваша текущая ситуация была бы решена довольно легко, так как вы могли бы просто пойти

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

Вы также получаете LifeTimeManager и виды, которые дают еще больший контроль. Да единство это накладные расходы по сравнению с SimpleIoC, но это то, что технология может обеспечить при необходимости, чем необходимость писать код самостоятельно.

Я думаю, что это сделало бы это:

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;
        }
    }
Другие вопросы по тегам