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.
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?
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%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%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%Tags und Links wpf c# mvvm prism navigation