INavigationAware 不适用于 Xamarin

INavigationAware Does not work on Xamarin

我正在玩弄 INavigationAware 和 OnNavigatedFrom、OnNavigatedTo 和 OnNavigatingTo。

我有两个带有 prism MVVM 的页面。第一页我在 viewModel 中实现了 INavigationAware,它工作正常。

但是第二页,我正在做一些测试并在视图自身的代码后面实现了 INavigationAware,它工作正常但是当我从那里删除它并将它移动到 ViewModel 时它不起作用。我确定了这一点

prism:ViewModelLocator.AutowireViewModel="True"

我尝试清理解决方案,但没有帮助

两个页面都是这样注册的:

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

第二页 ViewModel 可以在这里找到: https://gist.github.com/alkharashiam/c75f3c913f03f6e43c0000dbc805f670

代码有很多问题,我认为可能是在您的不同测试期间生成的,正如我看到的那样 INavigationAware 在基础 ViewModel 中被注释掉了,但实现仍然存在。

此时我猜它正在调用基本方法而不是 MerchantPageViewModel。您可以在基本方法中放置一个断点,看看它是否经过那里。可能只需在您的 OnNavigatedXXX(..) 方法中使用 override 关键字即可。

无论如何我会这样清理你的代码:

  1. 保留实现 INavigationAware 接口的基本视图模型

    public abstract class AppMapViewModelBase : BindableBase, IDestructible, INavigationAware
    
  2. MerchantPageViewModel 中删除 private readonly INavigationService _navigationService; 并将 navigtionService 传递给基本构造函数

    public MerchantPageViewModel(INavigationService navigationService) : base(navigationService)
    {
        // _navigationService = navigationService; removed
    }
    
  3. MerchantPageViewModel 声明中删除 INavigationAware 因为它已经由基础 class

    实现
    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 导航页面,只需使用基础 class 中的 NavigationService,如下所示:

    await NavigationService.NavigateAsync(...);
    

希望清楚!

编码愉快!