У меня странная проблема, и я в значительной степени нахожусь на своем пути, пытаясь разобраться.
У меня есть проводник, который активирует и деактивирует режимы просмотра, используемые для редактирования данных, эти модели представлений реализуют экран и используют OnDeactivate для обеспечения сохранения любых изменений перед закрытием.
Однако по какой-то причине OnDeactivate в одной из моих ViewModels никогда не вызывается, даже если я вижу, что она передается в DeactivateItem проводника.
Для этого в моем проводнике есть следующее:
private void SwitchScreen(Screen viewModel)
{
DeactivateItem(ActiveItem, true);
ActivateItem(viewModel);
NotifyOfPropertyChange(() => ProjectActionRegion);
}
public override void DeactivateItem(IScreen item, bool close)
{
base.DeactivateItem(item, close);
NotifyOfPropertyChange(() => ProjectActionRegion);
}
Это гарантирует, что когда TryClose называется, регион правильно обновлен. SwitchScreen вызывается каждый раз, когда выбор производится на datagrid, загружая модель просмотра. Я вижу, что элемент "Деактивировать" вызывается, когда я меняю выбор, и я вижу, как он передает правильную модель представления в этот метод.
Однако OnDeactivate по-прежнему никогда не вызывается, и я понятия не имею, почему:/
protected override void OnDeactivate(bool close)
{
System.Windows.Forms.MessageBox.Show("SAVE ME!");
}
Отредактировано для удаления неправильного кода (база была ошибкой, это мой фактический код)
РЕДАКТИРОВАТЬ:
Я только что понял, какая разница между рабочими версиями и сломанной версией. У меня есть view/viewmodel, который работает как дирижер, это прекрасно работает. Однако внутри этой модели просмотра я загружаю вторую модель view/viewmodel, которая также работает как проводник, но эта работа не работает, мне интересно, связано ли это с тем, что она находится внутри другого проводника (но на самом деле не обрабатывается этим проводником, просто загруженным в этот ViewModel)
Для правильной работы жизненного цикла экрана должны быть проведены все модели просмотра в иерархии вашего представления. Вы должны сделать своим ребенком проводник активным экраном вашего родительского проводника.
Вы можете сделать это, сделав его активным элементом родительского проводника или используя метод " ConductWith
на детском проводнике, передавая ссылку на родительский проводник.