Question

J'utilise Prism pour la navigation dans mon application Wpf. J'ai quelques modules, et chacun d'eux s'enregistre dans un menu principal à l'aide de commandes communes envoyées à l'aide du conteneur IoC dans le bootstrapper. Les entrées de menu sont liées à des commandes communes pour la navigation - ce qui ouvrira la vue correcte dans certaines régions. Tout est basé sur les recommandations que j'ai trouvées sur le site Prism.

Mon problème maintenant est que j'ai un module dans lequel il existe une condition indiquant si je veux ouvrir ViewA ou ViewB dans la région principale. Exemple: supposons que j’ai un module client, puis un "Client". élément de menu qui ouvrira le module client dans la vue principale. Et il y a une condition: si j'ai un client actif, je veux ouvrir CustomerDetailsView en cliquant sur l'élément de menu, sinon je veux ouvrir CustomersAdminView.

Quelle est l'approche recommandée pour résoudre ce problème? Je vois quelques options, mais je pense que toutes sonnent un peu hacky. Je travaille maintenant sur la création de ce que serait une MasterCustomerView dans l'exemple ci-dessus. Cette vue vérifiera alors la condition et ouvrira le contrôle UserControl en indiquant les détails de l'administrateur à l'intérieur. Je ne suis toutefois pas satisfait de cette solution. S'agirait-il d'une approche légitime? Rien de mieux?

Était-ce utile?

La solution

Dans les systèmes de menus que j'ai construits autour de Prism, j'ai fourni une surcharge aux modules qui enregistraient des vues, leur permettant de transmettre un délégué plutôt que le type de la vue. Dans ce délégué, je peux transmettre des informations pertinentes au délégué afin qu’il puisse décider comment créer sa vue.

C’est un peu compliqué, mais je peux vous donner quelques exemples pertinents.

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

     void RegisterMenuItem(string title, Type viewType);
}

Notez que j'ai un type qui est passé dans " RelevantInformation " qui peut contenir le client actuel, etc. Lorsque l'utilisateur clique sur l'élément de menu, j'appelle le délégué et lui transmet toutes les informations dont il pourrait avoir besoin pour prendre sa décision. Il retourne un objet View que je peux ensuite placer dans la région appropriée.

J'autorise également le module à transmettre un "canExecute". délégué, semblable au fonctionnement d'une commande (en fait, je prends tous les enregistrements de menu et les transforme en commandes). De cette manière, le module peut également choisir de se désactiver lui-même si une condition de RelevantInformation rend l’élément de menu invalide.

En réalité, ce n’est qu’un des nombreux moyens de résoudre ce problème, mais c’est proche de ce que je fais. J'espère que vous le trouverez utile ou que cela vous fait penser à d'autres moyens de résoudre le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top