InavigationAware在Xamarin上不起作用

时间:2019-10-10 07:52:05

标签: c# xamarin mvvm xamarin.forms prism

我在玩INavigationAware和OnNavigatedFrom,OnNavigatedTo和OnNavigatingTo。

我用棱镜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

1 个答案:

答案 0 :(得分:0)

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

在这一点上,我猜这是在调用基本方法而不是MerchantPageViewModel。您可以在基础方法中放置一个断点,看看它是否从那里经过。大概只要在OnNavigatedXXX(..)方法中使用override关键字就可以做到。

无论如何,我会通过以下方式清理代码:

  1. 保留实现INavigationAware接口的基本viewModel

    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(...);
    

希望很清楚!

编码愉快!