Обработка событий OnNavigatedFrom / OnNavigatedTo в ViewModel

Я пытаюсь выяснить путь к своему ViewModel, чтобы обработать сохранение или восстановить состояние страницы, когда от страницы перемещаются или До.

Первая вещь, которую я попробовал, состояла в том, чтобы добавить поведение EventToCommand к странице, но события (OnNavigatedFrom и OnNavigatedTo) объявляются защищенные, и EventToCommand не видит события для привязки с.

Затем я думал, что попытаюсь использовать класс Messenger, чтобы передать сообщение ViewModel с помощью кода в коде Представления позади:

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    Messenger.Default.Send<PhoneApplicationPage>(this);
    base.OnNavigatedFrom(e);
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    Messenger.Default.Send<PhoneApplicationPage>(this); 
    base.OnNavigatedTo(e);
}

Но это, кажется, имеет две проблемы, сначала имеет этот код в коде позади страницы. Во-вторых, ViewModel не может сказать различие между OnNavigatedFrom и событиями OnNavigatedTo, не имея необходимость создавать набор обертка классы для объекта PhoneApplicationPage (см. ОБНОВЛЕНИЕ ниже).

Что Самый MVVM-легкий дружественный путь состоит в том, чтобы обработать эти события?

ОБНОВЛЕНИЕ: Я смог решить второй вопрос путем Отправки сообщений как это:

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    Messenger.Default.Send<PhoneApplicationPage>(this,"NavigatedFrom");
    base.OnNavigatedFrom(e);
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    Messenger.Default.Send<PhoneApplicationPage>(this, "NavigatedTo"); 
    base.OnNavigatedTo(e);
}

и Регистрация их как это:

Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedFrom", false, (action) => SaveState(action));
Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedTo", false, (action) => RestoreState(action));
10
задан aloisdg says Reinstate Monica 2 April 2015 в 11:57
поделиться

1 ответ

Похоже, у вас уже есть решение проблемы. Я бы также предложил следующее:

Посмотрите на использование одного из значений сообщений, предоставленных в mvvm-toolkit, например:

    NotificationMessage<T>

Вот так:

    Messenger.Default.Send<NotificationMessage<PhoneApplicationPage>>(
new NotificationMessage<PhoneApplicationPage>(this, "Message"));
1
ответ дан 4 December 2019 в 01:55
поделиться