2017-08-08 170 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