#c# #wpf #mvvm #caliburn.micro
#c# #wpf #mvvm #caliburn.micro
Вопрос:
У меня странная проблема, и я в значительной степени нахожусь в тупике, пытаясь ее решить.
У меня есть проводник, который активирует и деактивирует viewmodels, используемые для редактирования данных, эти модели представления реализуют screen и используют 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 выполняется выбор, загружая viewmodel. Я вижу, что деактивация элемента вызывается при изменении выбора, и я вижу, что он передает правильную viewmodel в этот метод.
Однако OnDeactivate по-прежнему никогда не вызывается, и я понятия не имею, почему :/
protected override void OnDeactivate(bool close)
{
System.Windows.Forms.MessageBox.Show("SAVE ME!");
}
Отредактировано, чтобы удалить неправильный код (базовый. была ошибка, это мой фактический код)
Редактировать:
Я только что понял, в чем разница между рабочими версиями и нерабочей версией. У меня есть view / viewmodel, который работает как проводник, это работает нормально. Однако внутри этой viewmodel я загружаю второй view / viewmodel, который также работает как проводник, этот не работает, интересно, связано ли это с тем, что он находится внутри другого проводника (но фактически не обрабатывается этим проводником, просто загружается в эту viewmodel)
Комментарии:
1. пожалуйста, покажите объявление вашего класса Conductor , мне интересно, как вы наследуете от базового класса Conductor.
2. Я просто наследую так: публичный класс ProjectPanelViewModel : Conductor<IScreen>
3. так что это не проводник<IScreen>. OneActive() , переопределите Деактивацию и посмотрите, достигли ли вы точки останова.
4. Извините за поздний ответ. Как вы можете видеть выше, я уже переопределил DeactivateItem, и да, точка останова достигнута, как упоминалось, я вижу, что объект передается в base.ondeactivate. Однако эти объекты OnDeactivated никогда не вызываются, и это моя проблема
5. Если оно достигнуто, то что вы подразумеваете под НЕ деактивированным? в определенной ViewModel, которая в какой-то момент является ActiveItem, вы вызываете деактивацию и не достигаете точки торможения?
Ответ №1:
Для правильной работы жизненного цикла экрана должны выполняться все модели представления в вашей иерархии представлений. Вы должны сделать свой дочерний проводник активным экраном вашего родительского проводника.
Вы можете либо сделать это, сделав его активным элементом родительского проводника, либо используя ConductWith
метод для дочернего проводника, передавая ссылку на родительский проводник.
Комментарии:
1. Извините за поздний ответ, кажется, я забыл нажать «Отправить» в комментарии, это отлично сработало с использованием ConductWith, большое вам спасибо.