INavigationAware не работает на Xamarin - PullRequest
0 голосов
/ 10 октября 2019

Я играл с INavigationAware и OnNavigatedFrom, OnNavigatedTo и OnNavigatingTo.

У меня две страницы с призмой MVVM. На первой странице я реализовал INavigationAware в viewModel, и он отлично работает.

но на второй странице я проводил некоторое тестирование и реализовал INavigationAware в коде самого представления, и он работал нормально. Но когда я удалил его оттуда и переместил в ViewModel, он не работает. и я убедился в этом

prism:ViewModelLocator.AutowireViewModel="True"

Я пытался очистить решение, но это не помогло

Обе страницы зарегистрированы следующим образом:

containerRegistry.RegisterForNavigation<MainPage, MainPageViewModel>();
// the page that does not work 
containerRegistry.RegisterForNavigation<MerchantPage,MerchantPageViewModel>();

Secondpage ViewModelможно найти здесь: https://gist.github.com/alkharashiam/c75f3c913f03f6e43c0000dbc805f670

1 Ответ

0 голосов
/ 10 октября 2019

Есть много проблем с кодом, который, я думаю, возможно, был сгенерирован во время ваших разных тестов, как я вижу INavigationAware закомментированный в базовой ViewModel, но реализация все еще там.

Что на данный моментЯ предполагаю, что он вызывает базовые методы вместо MerchantPageViewModel. Вы можете установить точку останова в базовом методе и посмотреть, пройдет ли он там. Возможно, просто используя ключевое слово override в ваших методах OnNavigatedXXX (..), это будет сделано.

В любом случае, я бы очистил ваш код следующим образом:

  1. Сохранить базовую модель представления, реализующую интерфейс INavigationAware

    public abstract class AppMapViewModelBase : BindableBase, IDestructible, INavigationAware
    
  2. удалите private readonly INavigationService _navigationService; из MerchantPageViewModel и просто передайте navigtionService базовому конструктору

    public MerchantPageViewModel(INavigationService navigationService) : base(navigationService)
    {
        // _navigationService = navigationService; removed
    }
    
  3. удалите объявление INavigationAware из MerchantPageViewModel, так как оно уже реализованобазовый класс

    internal class MerchantPageViewModel : AppMapViewModelBase //, INavigationAware removed
    
  4. переопределяет ваши методы таким образом в MerchantPageViewModel:

    public override void OnNavigatedFrom(INavigationParameters parameters)
    {
        // throw new NotImplementedException();
    }
    
    public override void OnNavigatedTo(INavigationParameters parameters)
    {
        //throw new NotImplementedException();
        Merchant = parameters.GetValue<Merchant>("merchant");
        Debug.WriteLine(Merchant.MerhcnatName);
    }
    
    public override void OnNavigatingTo(INavigationParameters parameters)
    {
        // throw new NotImplementedException();
    }
    
  5. Если вам нужно перемещаться по страницамот дочерней ViewModel, просто используйте NavigationService из базового класса:

    await NavigationService.NavigateAsync(...);
    

Надеюсь, это понятно!

Удачного кодирования!

...