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
关键字即可。
无论如何我会这样清理你的代码:
保留实现 INavigationAware 接口的基本视图模型
public abstract class AppMapViewModelBase : BindableBase, IDestructible, INavigationAware
从 MerchantPageViewModel
中删除 private readonly INavigationService _navigationService;
并将 navigtionService 传递给基本构造函数
public MerchantPageViewModel(INavigationService navigationService) : base(navigationService)
{
// _navigationService = navigationService; removed
}
从 MerchantPageViewModel
声明中删除 INavigationAware
因为它已经由基础 class
实现
internal class MerchantPageViewModel : AppMapViewModelBase //, INavigationAware removed
在 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();
}
如果您需要从子 ViewModel 导航页面,只需使用基础 class 中的 NavigationService
,如下所示:
await NavigationService.NavigateAsync(...);
希望清楚!
编码愉快!
我正在玩弄 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
关键字即可。
无论如何我会这样清理你的代码:
保留实现 INavigationAware 接口的基本视图模型
public abstract class AppMapViewModelBase : BindableBase, IDestructible, INavigationAware
从
MerchantPageViewModel
中删除private readonly INavigationService _navigationService;
并将 navigtionService 传递给基本构造函数public MerchantPageViewModel(INavigationService navigationService) : base(navigationService) { // _navigationService = navigationService; removed }
从
实现MerchantPageViewModel
声明中删除INavigationAware
因为它已经由基础 classinternal class MerchantPageViewModel : AppMapViewModelBase //, INavigationAware removed
在
中以这种方式覆盖您的方法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(); }
如果您需要从子 ViewModel 导航页面,只需使用基础 class 中的
NavigationService
,如下所示:await NavigationService.NavigateAsync(...);
希望清楚!
编码愉快!