Очистить все элементы в 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;
}
}