В Prism 7 для форм Xamarin есть способ получить предыдущую страницу в обработчике OnNavigatedTo

Новое в использовании Prism в Xamarin Forms: INavigationAware дает мне обработчик OnNavigatedTo. Я хочу разное поведение в этой форме в зависимости от того, откуда мы перемещаемся. Есть ли способ получить предыдущую страницу?

В частности, у меня есть страница A, которая открывает страницу B (модальную), если выполняется определенное условие. Однако, если кнопка «Назад» нажата со страницы B, возвращая меня на страницу A, я не хочу снова открывать страницу B. Скорее, я хочу вернуться на предыдущую страницу под страницей A в стеке навигации.


person scotru    schedule 30.09.2018    source источник


Ответы (1)


Ну, передача страницы будет прямым нарушением дизайна MVVM, поскольку ваша ViewModel не должна иметь прямого представления о связанном представлении. Тем не менее, все методы INavigationAware используют NavigationParameters, что означает, что вы можете передать некоторое значение, которое вы можете проверить, как показано ниже:

NavigationService.NavigateAsync("ModalA", new NavigationParameters {{"reason", "foo"}});

public void OnNavigatedTo(INavigationParameters navigationParameters)
{
    switch(navigationParameters.GetValue<string>("reason"))
    {
        case "foo":
            // Do Foo
            break;
        case "bar":
            // Do Bar
            break;
    }
}
person Dan Siegel    schedule 30.09.2018
comment
Хм, не так просто передать параметры с аппаратных или программных кнопок назад. Я думаю, вы правы, другой дизайн был бы чище. Но я не уверен, согласен ли я с тем, что история навигации должна быть недоступна для виртуальной машины. Я вижу навигацию как внутри домена виртуальной машины. - person scotru; 01.10.2018
comment
@scotru вы можете не соглашаться со всем, что хотите. Суть в том, что ViewModel никогда не должна напрямую знать о представлении. Хотя я не могу вспомнить, является ли это функцией 7.0 или 7.1, у NavigationService есть расширение GetNavigationUriPath(), которое вы можете оценить, чтобы определить, откуда вы пришли. - person Dan Siegel; 02.10.2018
comment
Да, GetNavigationUriPath() возвращает текущий путь (после завершения NavigatedTo), а не предыдущий путь, поэтому до сих пор не могу сказать, откуда я пришел. На самом деле меня не волнует View — я был бы рад узнать ViewModel, которая перешла ко мне (на самом деле я бы предпочел ее). - person scotru; 03.10.2018
comment
Вы заставили меня больше думать об этом. Является ли метод Prism NavigationService.GoBack нарушением дизайна MVVM, если он используется в модели представления (поскольку он требует знания истории переходов по страницам)? Я сделал шаг назад и опубликовал новый вопрос, связанный с этим: вернуть навигацию в prism"> stackoverflow.com/questions/52616823/ - person scotru; 03.10.2018