【问题标题】:INavigationAware Does not work on XamarinINavigationAware 不适用于 Xamarin
【发布时间】:2020-02-07 14:34:25
【问题描述】:

我在玩 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

【问题讨论】:

标签: c# xamarin mvvm xamarin.forms prism


【解决方案1】:

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

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

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

  1. 保持基础 viewModel 实现 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,因为它已由基类实现

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

希望清楚!

编码愉快!

【讨论】:

  • 我会试一试,但问题是第一页和第二页都使用相同的基本模型,但是对于第一页它工作正常,对于第二页它不起作用,即使我设置第二页的 OnNavigatedTo 内的断点,它没有通过它..
  • hmmm 经过进一步调查,即使是简单的标签与 vm 中的字符串绑定也不起作用.. 即使设置了 prism:ViewModelLocator.AutowireViewModel="True",看起来视图和视图模型也没有绑定
  • 是否将 tabbpedpage 绑定到与 contentPage 不同的 ViewModel ?
  • 我觉得很愚蠢......显然我在我的视图中有这个绑定到另一个 ViewModel 我删除了它,一切正常.
  • 不用担心它会发生。但是如果没有所有来源,我很难弄清楚;)。无论如何,您仍然可以考虑对代码进行一些重构,因为您已经将一些导航内容散布在各处。编码愉快!
猜你喜欢
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2016-09-29
  • 2020-03-14
相关资源
最近更新 更多