2017-08-08 2 views
0

Ich verwende Prism mit Unity-Container für meine Xamarin Forms-Anwendung.Abmelden View and ViewModel in Prism.Unity.Forms

, wo ich bin Registrierung meine Seiten wie diese

Container.RegisterTypeForNavigation<ViewType,ViewModelType>(); 

manchmal

Container.RegisterTypeForNavigation<ViewType>(); 

Jetzt möchte ich zusammen mit ihren Ansichtsmodell einige der registrierten Seiten deregistrieren.

So etwas wie

Container.UnRegisterTypeForNavigation<ViewType>(); 

aber kann nicht einen Weg für sie herauszufinden. brauche Hilfe.

Bisher habe ich dies versucht haben

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

ohne Glück.

Grund, warum ich deregistrieren wollen ...

Ich habe zwei Ansichten

Project.Namespace1.ViewA 
Project.Namespace2.ViewA 

Jetzt möchte ich Project.Namespace1.ViewA öffnen, ist in einigen Fällen, und Project.Namespace2.ViewA in anderen Fällen.

Dies kann

NavigationService.NavigateAsync("ViewA"); 

Es navigiert als

erfolgen Ansicht in Unity Container registriert dauern. Aus diesem Grund möchte ich die vorherige Ansicht abmelden, bevor ich eine neue Ansicht registriere.

+0

Warum möchten Sie dies tun? Das Aufheben der Registrierung einer Ansicht verbirgt sie nicht, und das Aufheben der Registrierung eines Ansichtsmodells wird auch nichts bewirken. – Haukinger

+0

Es gibt keine unregistrierte Methode für Unity. Sie können sich diese Antwort für die Löschung von Registrierungen ansehen: https://stackoverflow.com/a/44361488/114664. Allerdings stimme ich @Haukinger zu, dass dies wahrscheinlich keine gute Idee ist. Was versuchst du zu erreichen? –

+0

Ich habe meine Frage mit Grund hinter dem Aufheben der Registrierung aktualisiert. hoffe das hilft. – Yogesh

Antwort

1

Sie sollten zu Project.Namespace1.ViewA und Project.Namespace2.ViewA (oder einigen anderen eindeutigen Namen) navigieren.

RegisterTypeForNavigation verwendet ein optionales Zeichenfolgenargument für den Namen. Geben Sie also einen eindeutigen Namen für jede Ihrer Ansichten ein. Navigieren Sie bei der Navigation zu ViewA zu dem konkreten ViewA, zu dem Sie navigieren möchten. Wenn Sie das Register-Unregister-Verhalten unbedingt emulieren müssen, erstellen Sie einen Dienst, der das derzeit aktive ViewA enthält.

Beispiel:

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); 

Wahrscheinlich wollen Sie auch eine enum anstelle eines Bündels von Strings.

+0

netter Trick. Ich werde für jetzt gehen. BTW, haben Sie jetzt einen anderen ioc-Container, der die tatsächliche Aufhebung der Registrierung von Typ/Instanz unterstützt? – Yogesh

+0

wahrscheinlich hat ninject dies, da sie eine Menge bizarrer Funktionalität haben ;-) und Einheit kann es auch, obwohl manuell, aber das Abmelden fühlt sich an, als würde ich gegen den Container arbeiten, – Haukinger

Verwandte Themen