2013-05-27 3 views
0

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

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

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

Обновление:

с Rudi ответ я примерить закрытия, чтобы сделать

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

и это работает, но это, кажется, не подходит мне Разрегистрирует VM и зарегистрировать его еще раз!

ответ

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; 
     } 
    } 
+0

но в этом случае, когда я открываю одно и то же окно, ничего не работает (там нет виртуальной машины для просмотра) – Akrem

+0

, вы можете перерегистрировать ViewModel 'SimpleIoc.Default.Register ();', но так как я не используйте это, я не могу сказать, действительно ли это будет работать, или если это правильный способ сделать это так. – Rudi

+0

Я тестирую его, и он работает, но я не вижу, что хорошая практика сделать это для каждой виртуальной машины – Akrem

1

Вы можете просто отменить экземпляр класса, чем удалить весь класс, если вы хотите.

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

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

Смежные вопросы