在Prism.Unity.Forms

时间:2017-08-08 15:30:22

标签: xamarin.forms unity-container prism

我正在将Prism与Unity容器一起用于我的Xamarin Forms应用程序。

我在这里注册我的网页

Container.RegisterTypeForNavigation<ViewType,ViewModelType>();

有时候

Container.RegisterTypeForNavigation<ViewType>();

现在我想取消注册一些已注册的页面及其ViewModel。

这样的东西
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");

导航到Unity容器中注册的最后一个视图。 这就是为什么我想在注册新视图之前取消注册以前的视图。

1 个答案:

答案 0 :(得分:1)

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

RegisterTypeForNavigation为名称提供可选的字符串参数,因此为每个视图传递一个唯一的名称。导航到ViewA时,您应该导航到要导航到的具体ViewA。如果您绝对需要模拟register-unregister-behavior,请创建一个包含当前活动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而不是一堆字符串。