Конструктор 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.

Ответы на вопрос(1)

Ваш ответ на вопрос