我在玩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
答案 0 :(得分:0)
我认为代码的很多问题可能是在您的不同测试期间生成的,因为我可以在基础ViewModel中看到INavigationAware
的注释,但是实现仍然存在。
在这一点上,我猜这是在调用基本方法而不是MerchantPageViewModel
。您可以在基础方法中放置一个断点,看看它是否从那里经过。大概只要在OnNavigatedXXX(..)方法中使用override
关键字就可以做到。
无论如何,我会通过以下方式清理代码:
保留实现INavigationAware接口的基本viewModel
public abstract class AppMapViewModelBase : BindableBase, IDestructible, INavigationAware
从private readonly INavigationService _navigationService;
中删除MerchantPageViewModel
,然后将navigtionService传递给基本构造函数
public MerchantPageViewModel(INavigationService navigationService) : base(navigationService)
{
// _navigationService = navigationService; removed
}
从INavigationAware
声明中删除MerchantPageViewModel
,因为它已经由基类实现
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导航页面,只需使用基类中的NavigationService
即可:
await NavigationService.NavigateAsync(...);
希望很清楚!
编码愉快!