Конструктор ViewModel снова вызывается при навигации, поэтому подписки на мессенджеры снова подписываются
Я строю кроссплатформенное мобильное приложение, используяMvvmCross
фреймворк.
Поскольку я хотел бы поделиться информацией между ViewModels, я регистрирую уведомления внутри ViewModel.S конструктор, используя встроенный.MvxMessenger
Позволять'Предполагается сообщение с именемShowAdsMsg
, а затем ViewModel выглядит следующим образом:
public class AdsViewModel : BaseLookersViewModel, IAdsViewModel
{
private MvxSubscriptionToken _showAdsMsgToken;
public AdsViewModel()
{
_showAdsMsgToken = MvxMessenger.Subscribe(message => onShowAdsNavigation(), MvxReference.Weak);
MyMessenger.PublishLastMessage();
}
private void onShowAdsNavigation()
{
//Do Stuff
}
}
ОMyMessenger
вещь:
Фактическая навигация к ViewModel выполняется из.MainViewModel
Так как в тот самый момент самой навигацииAdsViewModel
сообщений, опубликованных сMainViewModel
не может достичь этого.
Итак, моя идея была наивноПомните" сообщение и опубликуйте его, когда новая ViewModel будет готова.
Так что теперь навигационный вызов отMainViewModel
выглядит так:
private void navigate()
{
MyMessenger.RememberMessage(new ShowAdsMsg(this));
ShowViewModel( );
}
Теперь я могу перейти к ViewModel, и все уведомления успешно перехвачены.
Тем не мение...
Когда я нажимаю кнопку НАЗАД на устройстве и снова перемещаюсь к той же ViewModel,
Конструктор вызывается снова, и подписка на сообщение повторяется.
В результате, когда приходит сообщениеonShowAdsNavigation()
Хендлер увольняют дважды!
я нашелэтот аналогичный пост, обсуждающий вопрос о том, как правильно располагать ViewModel,
но он не содержит прямого решения моей проблемы.
Что мне нужно, так это решение. Это может быть одно из следующих:
Идея как не подписываться на сообщения на ViewModels ctor.Руководство о том, как и когда правильно утилизировать ViewModel.Объяснение того, почему конструктор вызывается снова, и как этого избежать.Совершенно другой подход к обмену информацией ViewModel.Заранее спасибо за вашу помощь!
Изменить: я нашелэтот Ответ SO, который в основном отвечает пункту 3 в списке выше. Тем не менее, мне интересно, какой подход я должен предпринять в отношении вопроса мессенджера.
Другое редактирование: я проверил, что такое же поведение существует с учебником MvvmCrossN-05-MultiPage, Я просто добавил ctor во SecondViewModel и достигал точки останова внутри него после каждого BACK + Renavigate.