Caliburn.Micro - OnDeactivate Не запускается

1

У меня странная проблема, и я в значительной степени нахожусь на своем пути, пытаясь разобраться.

У меня есть проводник, который активирует и деактивирует режимы просмотра, используемые для редактирования данных, эти модели представлений реализуют экран и используют 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)

  • 0
    Пожалуйста, покажите объявление вашего класса Conductor, меня интересует, как вы наследуете от базового класса Conductor.
  • 0
    Я просто наследую так: открытый класс ProjectPanelViewModel: Conductor <IScreen>
Показать ещё 8 комментариев
Теги:
wpf
mvvm
caliburn.micro

1 ответ

1
Лучший ответ

Для правильной работы жизненного цикла экрана должны быть проведены все модели просмотра в иерархии вашего представления. Вы должны сделать своим ребенком проводник активным экраном вашего родительского проводника.

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

  • 0
    Извините за поздний ответ, мне кажется, я забыл нажать кнопку отправки комментария, это отлично работало с использованием ConductWith, большое спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню