Xamarin.forms 在Prism.Unity.Forms中注销视图和视图模型

Xamarin.forms 在Prism.Unity.Forms中注销视图和视图模型,xamarin.forms,unity-container,prism,Xamarin.forms,Unity Container,Prism,我正在为我的Xamarin表单应用程序使用带Unity容器的Prism 我在哪里注册我的页面像这样 Container.RegisterTypeForNavigation<ViewType,ViewModelType>(); 没有运气 我想注销的原因 我有两种看法 Project.Namespace1.ViewA Project.Namespace2.ViewA 现在我想在某些情况下打开Project.Namespace1.ViewA,在其他情况下打开Project.Namesp

我正在为我的Xamarin表单应用程序使用带Unity容器的Prism

我在哪里注册我的页面像这样

Container.RegisterTypeForNavigation<ViewType,ViewModelType>();
没有运气

我想注销的原因

我有两种看法

Project.Namespace1.ViewA
Project.Namespace2.ViewA
现在我想在某些情况下打开Project.Namespace1.ViewA,在其他情况下打开Project.Namespace2.ViewA

这可以按如下方式完成

NavigationService.NavigateAsync("ViewA");
它导航到Unity容器中注册的最后一个视图。 这就是为什么我想在注册新视图之前取消注册以前的视图。

您应该导航到Project.Namespace1.ViewA和Project.Namespace2.ViewA或其他一些唯一的名称

RegisterTypeForNavigation采用可选的字符串参数作为名称,因此为每个视图传递一个唯一的名称。导航到ViewA时,应导航到要导航到的具体ViewA。如果您确实需要模拟register unregister行为,请创建一个包含当前活动ViewA的服务

例如:

Container.RegisterTypeForNavigation<Project.Namespace1.ViewA,ViewModelType>( "ViewA1" );
Container.RegisterTypeForNavigation<Project.Namespace2.ViewA,ViewModelType>( "ViewA2" );

interface IViewASelector
{
    string ViewA { get; set; }
}

// register Namespace1 and unregister Namespace2
_viewASelector.ViewA ="ViewA1";

// navigate to the active ViewA
NavigationService.NavigateAsync( _viewASelector.ViewA );

可能您还需要一个枚举而不是一堆字符串。

为什么要这样做?注销视图不会隐藏它,注销视图模型也不会处理任何事情。Unity没有现成的注销方法。您可以查看此答案以清除注册:。然而,我同意@Haukinger的观点,这可能不是一个好主意。你想实现什么?我已经更新了我的问题,并说明了取消注册视图背后的原因。希望这有帮助。好把戏。我现在就同意。顺便说一句,您现在有没有其他支持实际注销类型/实例的ioc容器?可能ninject有这个功能,因为它们有很多奇怪的功能;-unity也可以这样做,虽然是手动的,但对我来说,取消注册就像是在对抗容器,
Project.Namespace1.ViewA
Project.Namespace2.ViewA
NavigationService.NavigateAsync("ViewA");
Container.RegisterTypeForNavigation<Project.Namespace1.ViewA,ViewModelType>( "ViewA1" );
Container.RegisterTypeForNavigation<Project.Namespace2.ViewA,ViewModelType>( "ViewA2" );

interface IViewASelector
{
    string ViewA { get; set; }
}

// register Namespace1 and unregister Namespace2
_viewASelector.ViewA ="ViewA1";

// navigate to the active ViewA
NavigationService.NavigateAsync( _viewASelector.ViewA );