Gibt es eine Möglichkeit, eine Ansicht (nach Name) aus einer Prism-Region zu entfernen, wenn die Ansicht mit der Methode "RegionManager.RequestNavigate" hinzugefügt wurde?

8

Ich verwende Prism zur Navigation in meiner WPF MVVM-Anwendung. Ich registriere meine Ansicht wie folgt.

%Vor%

Ich zeige diese Ansicht wie folgt an.

%Vor%

An anderer Stelle in der Anwendung muss ich diese Ansicht in einem Event-Handler entfernen; Der folgende Code gibt jedoch ArgumentNullException zurück.

%Vor%

Dies zeigt an, dass die Methode RequestNavigate % MyView nicht zu MyRegion hinzufügt und den Namen "MyView" verwendet. Ich weiß, wenn ich die Methode _regionManager.Add(MyView, "MyView") verwenden würde, würde die Methode GetView nicht null zurückgeben. Leider scheint RequestNavigate den View-Namen nicht auf die gleiche Weise zu behandeln. Gibt es eine Möglichkeit, eine Ansicht (nach Namen) aus einer Region zu entfernen, als die Ansicht mit der Methode RequestNavigate hinzugefügt wurde?

    
Timothy Schoonover 06.08.2013, 17:00
quelle

2 Antworten

3

Es ergibt sich daraus, wie Sie Ihre Ansicht hinzufügen, nicht mit Ihrer Entfernung. Zuvor gestellte Antworten, indem Sie die Ansicht vollständig hinzufügen, einschließlich des Namens.

%Vor%

So können Sie jetzt Ihre Suche und Entfernung durchführen:

%Vor%

Ohne den Namen während der Regions.Add ()

zu definieren

Definieren Sie in Ihrer Ansicht eine Eigenschaft, auf die zugegriffen werden kann (öffentlich, wenn mehrere Projekte, intern, wenn alle in einem Projekt enthalten sind). Verwenden Sie diese Eigenschaft in allen Fällen. Ein Beispiel wäre eine öffentliche Zeichenkette ViewTitle {get {return "XYZ"; }}. Rufen Sie dann das Element mit dem gewünschten ViewTitle aus den Ansichten ab. Die Views-Auflistung ist die Auflistung von Ansichten in dieser Region. Daher können Sie dynamic in .NET 4.0+ verwenden, um den Typ zu ignorieren und die angegebene Eigenschaft / Funktion zu erhalten, vorausgesetzt, sie ist dort vorhanden. Eine andere Möglichkeit besteht darin, dass das importierte ViewModel in der Ansicht einen Getter verwendet und nicht nur den DataContext setzt. Dann würden Sie die Eigenschaft "ist" für das ViewModel überprüfen, das Sie suchen. Entfernt die String-Suche, macht aber den Datenkontext der View verfügbar. Also machen Sie wahrscheinlich ein Enum wie ich mit der Region machen würde.

Ich habe alles in die CS-Datei meines Views eingefügt, damit Sie sehen können, wie es funktioniert, ohne es zu verkomplizieren oder MVVM wirklich zu brechen.

%Vor%

Jetzt im ViewModel zu einem bestimmten Zeitpunkt:

%Vor%     
bland 07.08.2013, 15:01
quelle
3

Wir haben uns kürzlich mit demselben Problem konfrontiert; Danke @ Odysseus.section9 für das Zeigen seiner Wurzel in Ihrem Kommentar, es hat wirklich geholfen.

Wir haben in Betracht gezogen, damit alle Ansichten ein implementiert haben Schnittstelle mit einer Name-Eigenschaft , fühlte sich aber nicht ganz richtig an. Dann haben wir uns mit der @bland-Lösung beschäftigt, aber wir fühlten uns nicht wohl bei der Verwendung von dynamic. Daher gingen wir für einen sehr ähnlichen Ansatz mit reflection .

Da wir bereits die ViewExportAttribute verwenden, um unsere Ansichten zu exportieren, enthält sie das Die gewünschte ViewName-Eigenschaft. Wir suchen für jede Ansicht in einer Region nach Attributen, suchen nach ViewExportAttribute und prüfen den Wert der Eigenschaft ViewName . Obwohl in unserem Design alle Ansichten mit Anmerkungen versehen sind, toleriert die Abfrage Ansichten, die das nicht tun - sie ignoriert sie einfach.

Aus praktischen Gründen haben wir eine Erweiterungsmethode für IRegion erstellt, die innerhalb einer Region nach den Ansichten mit dem gewünschten Namen sucht. Außerdem haben wir zwei Erweiterungsmethoden für IRegionManager für zwei übliche Szenarien in unserer Anwendung hinzugefügt: die Wiederverwendung einer vorhandenen Ansicht oder das Navigieren und Entfernen aller vorhandenen Ansichten (die einen Namen enthalten) und das Navigieren. Ich denke, das letztere löst Ihr Bedürfnis, nur indem Sie den Anruf zu

loswerden %Vor%     
jnovo 27.11.2013 19:28
quelle

Tags und Links