2017-08-08 58 views
0

我对Xamarin Forms应用程序使用Prism和Unity容器。在Prism.Unity.Forms中取消注册View和ViewModel

我在哪里注册我的网页这样

Container.RegisterTypeForNavigation<ViewType,ViewModelType>(); 

有时

Container.RegisterTypeForNavigation<ViewType>(); 

现在我要注销一些注册页面与他们一起视图模型。

喜欢的东西

Container.UnRegisterTypeForNavigation<ViewType>(); 

但它不能想出一个办法。需要帮忙。

到目前为止,我已经试过了,

ContainerRegistration registrationContainer = Container.Registrations.FirstOrDefault(obj => obj.MappedToType == GetPageType(pageType)); 
if (registrationContainer?.LifetimeManager!=null) 
{ 
    registrationContainer.LifetimeManager.RemoveValue(); 
} 

没有运气。

原因,我想注销...

我有两个观点

Project.Namespace1.ViewA 
Project.Namespace2.ViewA 

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

这可以作为

NavigationService.NavigateAsync("ViewA"); 

它定位到上次查看在团结容器中注册完成。 这就是为什么我要在注册新视图之前取消注册以前的视图。

+0

你为什么要这样做?取消注册视图不会隐藏视图,也不会注销视图模型。 – Haukinger

+0

Unity没有开箱即用的注销方法。您可以查看清除注册的答案:https://stackoverflow.com/a/44361488/114664。不过,我同意@Haukinger这可能不是一个好主意。你想达到什么目的? –

+0

我更新了我的问题,并注销了意见后的原因。希望这可以帮助。 – Yogesh

回答

1

您应该导航到Project.Namespace1.ViewAProject.Namespace2.ViewA(或其他一些独特的名称)。

RegisterTypeForNavigation需要一个可选的字符串参数作为名称,因此为每个视图传递一个唯一的名称。当导航到ViewA时,您应该导航到您要导航到的具体ViewA。如果您绝对需要模拟注册 - 取消注册行为,请创建一个包含当前活动的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); 

也许,你还想要一个enum,而不是一串字符串。

+0

不错的把戏。我现在就去用它。 顺便说一句,你现在是否有任何其他的ioc容器支持实际的类型/实例注销? – Yogesh

+0

可能ninject有这个,因为他们有很多奇怪的功能;-)和团结也可以做到这一点,虽然手动,但取消注册感觉像对我工作的容器, – Haukinger