Frage

Ich verwende Prism für die Navigation in meiner WPF -Anwendung. Ich habe ein paar Module, und jeder von ihnen registriert sich in einem Hauptmenü über gemeinsame Befehle, die mit dem IOC -Container im Bootstrapper gesendet wurden. Die Menüeinträge sind an gemeinsame Befehle für die Navigation gebunden, die die richtige Ansicht in einigen Regionen öffnen. Alles basiert auf Empfehlungen, die ich über der Prism -Site gefunden habe.

Mein Problem ist nun, dass ich ein Modul habe, in dem es eine Erkrankung gibt, die besagt, ob ich Viewa oder ViewB in der Hauptregion öffnen möchte. Beispiel: Nehmen wir an, ich habe ein Kundenmodul - und dann einen "Kunden" -Menüer, der das Kundenmodul in der Hauptansicht öffnet. Und es gibt eine Bedingung: Wenn ich einen aktiven Kunden habe, möchte ich das CustomerDetailsView beim Klicken auf den Menüpunkt öffnen, ich möchte den CustomerAdminView ansonsten öffnen.

Was ist der empfohlene Ansatz, um dies zu lösen? Ich sehe ein paar Optionen, aber ich denke, alle klingen ein bisschen hackig. Jetzt arbeite ich daran, im obigen Beispiel ein MasterCustomerview zu erstellen. Diese Ansicht überprüft dann den Zustand und öffnet die UserControl, die die beiden Details des Administrators im Inneren enthält. Ich bin jedoch nicht alle mit dieser Lösung zufrieden - wäre es ein Legitim -Ansatz? Etwas besser?

War es hilfreich?

Lösung

In den Menüsystemen, die ich um Prism aufgebaut habe, habe ich eine Überlastung für Module zur Verfügung gestellt, die Ansichten registrieren, die es ihnen ermöglichen, einen Delegierten zu übergeben, anstatt den Typ der Ansicht. In diesem Delegierten kann ich relevante Informationen an den Delegierten weitergeben, damit er entscheiden kann, wie die Ansicht erstellt wird.

Dies ist etwas kompliziert, aber ich kann Ihnen ein paar relevante Beispiele geben.

public interface IMenuRegistry
{
     void RegisterMenuItem(string title, 
                           Func<RelevantInformation, Object> executeFunction, 
                           Func<RelevantInformation, bool> canExecuteFunction);

     void RegisterMenuItem(string title, Type viewType);
}

Beachten Sie hier einen Typ, der in "relevantem Information" übergeben wird, der den aktuellen Kunden enthalten kann usw. Wenn der Benutzer auf den Menüelement klickt, rufe ich den Delegierten an und übergeben Sie alle Informationen, die er möglicherweise für die Entscheidung benötigt. Es gibt ein View -Objekt zurück, das ich dann in die angemessene Region einfügen kann.

Ich erlaube dem Modul auch, einen "CaneExecute" -Delegierten zu übergeben, ähnlich wie ein Befehl funktioniert (in der Tat nehme ich alle Menüregistrierungen und verwandle sie in Befehle). Auf diese Weise kann sich das Modul auch entscheiden, wenn sich selbst eine Bedingung in relevanter Formation des Menüelements ungültig macht.

In Wirklichkeit ist dies nur eine von vielen Möglichkeiten, um dieses Problem zu lösen, aber dies ist nahe an dem, was ich tue. Hoffentlich finden Sie es hilfreich oder Sie können über alternative Möglichkeiten nachdenken, um das Problem zu lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top