Xamarin.Forms 的棱镜:我无法解析导航服务,除非 ViewModelLocator.AutowireViewModel="True"
Prism for Xamarin.Forms: I cannot resolve the navigationService unless if ViewModelLocator.AutowireViewModel="True"
卡了好几天了。。。终于找到问题了
我有两页,一页用于平板电脑,另一页用于 phone。由于它们具有不同的名称,因此使用 ViewModelLocator.AutowireViewModel 共享相同的视图模型作为绑定上下文是行不通的。因此,对于这种情况,我使用的是经典绑定上下文,因为我不想为每个页面创建一个视图模型副本。
我的问题是当我 运行 它给我一个错误说 "no parameterless constructor defined for this object prism" 这个错误的原因是 viewModel 有一个需要 navigationService 的构造函数。
要解决此错误,我必须删除导航服务作为参数,但我需要它以便我可以使用它进行导航。
在这种情况下,我建议使用 ViewModelLocationProvider.Register 方法。所以在应用程序的 RegisterTypes 方法中,你可以放一个类似这样的条件:
if (Device.Idiom == TargetIdiom.Tablet)
ViewModelLocationProvider.Register("MainPage", () => your logic);
else
ViewModelLocationProvider.Register("MainPage", () => your logic);
编辑:实际上,您仍然必须以这种方式手动解析 INavigationService。我将重新打开您的 Prism Issue。我们可以研究改进 ViewModelocationProvider.Register 方法以启用此方案。
卡了好几天了。。。终于找到问题了
我有两页,一页用于平板电脑,另一页用于 phone。由于它们具有不同的名称,因此使用 ViewModelLocator.AutowireViewModel 共享相同的视图模型作为绑定上下文是行不通的。因此,对于这种情况,我使用的是经典绑定上下文,因为我不想为每个页面创建一个视图模型副本。 我的问题是当我 运行 它给我一个错误说 "no parameterless constructor defined for this object prism" 这个错误的原因是 viewModel 有一个需要 navigationService 的构造函数。 要解决此错误,我必须删除导航服务作为参数,但我需要它以便我可以使用它进行导航。
在这种情况下,我建议使用 ViewModelLocationProvider.Register 方法。所以在应用程序的 RegisterTypes 方法中,你可以放一个类似这样的条件:
if (Device.Idiom == TargetIdiom.Tablet)
ViewModelLocationProvider.Register("MainPage", () => your logic);
else
ViewModelLocationProvider.Register("MainPage", () => your logic);
编辑:实际上,您仍然必须以这种方式手动解析 INavigationService。我将重新打开您的 Prism Issue。我们可以研究改进 ViewModelocationProvider.Register 方法以启用此方案。