2010-11-14 4 views
0

TLDR Version: Je dois trouver un moyen d'implémenter une sorte de "MessageCenter" où tout contrôle peut s'inscrire pour recevoir des messages d'autres contrôles, sans savoir d'où proviennent ces messages (ou il peut savoir, tant que cela ne signifie pas de travail supplémentaire pour moi). Après avoir dactylographié tout cela, je pense que je me suis aidé à réaliser ce que je veux, mais si vous pouvez recommander des solutions pré-emballées, ce serait génial!WPF - Les commandes disjointes doivent communiquer


Alors, je travaille sur ce projet où l'utilisateur arrive à faire des choix et (plus ou moins) Agencez une page. Les règles sont très strictes, cependant. À chaque étape, on leur donne un nombre limité de façons de modifier la page. Pensez-y comme un système de gabarit. Il existe plusieurs interfaces: ITemplate, IContentArea et ISpecificControl Chaque modèle possède un certain nombre de zones de contenu. Chaque ContentArea a exactement trois contrôles spécifiques.

Ils se compositing ensemble quelque chose comme ce dessin brut: My Terrible Example

La grande boîte violet-ish lumière est le modèle. Les boîtes jaunes, roses et brunes sont des types concrets différents d'IContentArea. Les boîtes vertes, bleu clair et violet foncé sont des types concrets différents de ISpecificControl.

Chaque implémentation concrète de ces interfaces aura un certain nombre de propriétés publiques que j'aimerais que l'utilisateur puisse définir.

Par exemple: Les cases vertes peuvent vous permettre de définir la taille de la police et la couleur de la police. Les cases bleu clair peuvent vous permettre de définir la couleur d'arrière-plan. Les cases violet foncé peuvent vous permettre de définir la taille et la marge de l'image. Les boîtes jaunes, roses et brunes vous permettent de choisir les trois commandes spécifiques que vous souhaitez utiliser. La grande boîte violet-clair vous permet de choisir comment les zones de contenu sont disposées (certaines peuvent en avoir seulement deux ou trois, peut-être sont-elles disposées en diagonale).

J'ai créé un attribut personnalisé que je peux appliquer aux propriétés du ViewModel qui les identifient comme pouvant être modifiées par l'utilisateur, et j'ai réservé de l'espace pour ajouter dynamiquement des contrôles de paramètres. L'idée est que l'utilisateur ne peut éditer EXACTEMENT qu'un seul article à la fois. Quand ils le choisissent, je vais utiliser la réflexion pour examiner les propriétés publiques du ViewModel du contrôle et trouver toutes les propriétés qui sont marquées avec l'attribut editable, regarder leurs types, et générer des contrôles dynamiquement pour les éditer (avec des liaisons, bien sûr). Nous appellerons cela le "SettingsWizard".

Le problème est vraiment deux fois:

1er: Comment recommanderiez-vous que je limite l'utilisateur à sélectionner uniquement une seule boîte à la fois? Il est clair que j'ai besoin d'une sorte d'événement ou de messagerie à l'échelle de l'application. Quelle forme cela prendrait-il exactement? Et comment pourrais-je enregistrer mon "SettingsWizard" pour prendre connaissance de ces messages. J'ai l'impression que ça va être quelque chose de vraiment simple, mais je le néglige parce que ça ne me semble pas normal ou propre. Tout ce qui laisse l'un de ces contrôles envoyer un message qui dit, "Hey, je suis le dernier à cliquer sur Si quelqu'un d'autre a été sélectionné, maintenant vous ne l'êtes pas", permettrait de résoudre le problème, tant que les contrôles de réception n'avaient pas besoin de savoir d'où venait le message.Je pensais à une sorte de "MessageCenter" statique où, quand chaque contrôle est créé, il enregistre les messages passés (dans son constructeur) en utilisant une interface définie, et tout contrôle a la possibilité d'envoyer un message au MessageCenter , qui le transmettrait ensuite. Est-ce que ça te paraît correct? J'ai l'impression que quelque chose de cette nature existe déjà. Comme les fonctionnalités de Prism (mais je n'ai pas vraiment besoin du reste des fonctionnalités).

2ème: Comment laisser mon "SettingsWizard" savoir qu'il a un nouvel élément dont il a besoin pour afficher les paramètres? Vraisemblablement, une solution pour le premier élément peut également être utilisée pour résoudre celui-ci. C'est juste un type différent de notification.

Répondre

0

Basé sur votre paragraphe TLDR, je vous recommande de jeter un oeil au modèle event aggregator. Si vous cherchez une implémentation existante, vous pouvez jeter un oeil à Prism's. Je pense que Prism est un peu sur-machiné et a déjà posté un simpler implementation.

Questions connexes