Когда располагать ViewModel в MVVM Light - PullRequest
5 голосов
/ 12 августа 2011

Я пытаюсь начать использовать MVVM Light и наткнулся на «новый» интерфейс ICleanup. Мне было просто интересно, когда вы очистите виртуальную машину ... когда уйдете со страницы?

Кроме того, я вижу, что в ViewModelLocator есть основная очистка, которая должна очищать все виртуальные машины ... когда это будет использоваться?

Большое спасибо

С уважением, Mauro

1 Ответ

8 голосов
/ 12 августа 2011

Преимущество интерфейса ICleanup по сравнению с реализацией IDispose (которая была там ранее) заключается в том, - как утверждает Лоран, - что вы можете вызывать его чаще и без маркировки виртуальной машины как утилизированной. Это означает, что вы должны вызывать ICleanup.Cleanup всякий раз, когда вы хотите / должны отменить регистрацию обработки сообщений для вашей виртуальной машины. Очевидно, что в этом случае вам нужен метод, который снова регистрирует все обработчики сообщений, когда они понадобятся вам позже.

Лично я больше знаком с IDispose способом очистки виртуальных машин, особенно потому, что я склонен к контейнерам IOC. Но я вижу случай Лорана, и реализация IDisposable вызова Cleanup на виртуальной машине - это не обман.

Как правило, момент времени, когда вы удаляете / очищаете виртуальную машину, зависит от того, как она была создана, и от срока службы объекта. Эти решения регулируются дизайном вашей заявки, и нет четких указаний для , когда вы должны это сделать. Но имейте в виду, что должен выполняться всякий раз, когда вы регистрируете обработчик сообщений в вашей модели представления - в других случаях это не является строго необходимым.

И, говоря о обработчиках сообщений, не забудьте также отменить их регистрацию в своих представлениях, когда вы зарегистрировали обработчик сообщений там (см. этот пост ). - Подумав, я поставлю здесь код, чтобы прояснить его и использовать в будущем:

В конструкторе вашего представления в коде файла добавьте следующий код, чтобы гарантировать, что зарегистрированные обработчики сообщений будут освобождены при выгрузке представления:

public MyView() {
    this.Unloaded += (o, e) => { Messenger.Unregister(this); }
}
...