2008-10-10 4 views
3

Il s'agit davantage d'une question de conception.Actualisation automatique de l'interface utilisateur lorsque les objets métier changent

Je construis un outil qui affiche des objets métier de différentes façons (par exemple, les nœuds d'arborescence, les éléments de vue de liste, les zones de liste déroulante, les champs de texte, etc.). Chaque fois que l'utilisateur change l'un d'entre eux, un événement signale que cet objet métier a été modifié ou que la collection à laquelle il appartient a été modifiée. Étant donné que cet objet métier, ou la collection à laquelle il peut appartenir, peut être affiché à plusieurs endroits, chacun de ces éléments d'interface utilisateur doit être mis à jour pour refléter ce changement. Existe-t-il une solution élégante pour que chaque type d'élément d'interface utilisateur soit mis à jour correctement en cas de changement?

J'ai quelques idées de comment cela peut être fait, mais j'aimerais voir si quelqu'un a eu ce problème et était heureux avec leur solution. C'est un C# WinForm, mais une solution peut être dans n'importe quelle langue.

Mes pensées actuelles sur le problème et une solution possible:

Il est plus compliqué quand vous voulez nettoyer des liaisons d'événements (c.-à-businessObject.Changed - = ObjectChanged) lorsque vos objets métier font partie d'un TreeNodeCollection/ListViewITemCollection/ComboBoxItemCollection et Clear() sont appelés sur la collection. Qu'en est-il d'un "Service", où chaque objet et son élément ui peuvent s'enregistrer, où les événements de l'objet métier peuvent être écoutés dans un emplacement, et chaque élément de l'interface utilisateur est mis à jour lorsque les événements sont levés? Lorsque tous les éléments de l'interface utilisateur se sont désinscrits, l'abonnement à l'événement de cet objet est supprimé.

Le problème avec cette solution est que chaque contrôle devra être responsable de l'enregistrement du composant de l'interface utilisateur et de l'objet à chaque création - ce qui peut être salissant.

Vos pensées?

+0

Je suis assez sûr qu'il ya un modèle de conception pour cela. –

Répondre

2

Utilisez un système de messagerie. Créer un délégué comme celui-ci:

public delegate void ObjectRefresh(BusinessObject obj); 

Ensuite, dans votre classe BusinessObject:

public event ObjectRefresh; 

Et quand une propriété est modifiée:

if (ObjectRefresh) 
    ObjectRefresh(this); 

Et sur tous vos uis:

BusinessObject obj = GetBusinessObject(); 
obj.ObjectRefresh += this.ObjectRefresh; 
... 
private void ObjectRefresh(BusinessObject obj) 
{ 
    // update UI 
} 

:)

+0

Je suggère de mettre le code pour appeler le délégué dans sa propre méthode (protégée), OnObjectRefresh. –

0

assurez-vous vraiment besoin de cela, à savoirque cela n'arrive pas déjà. Par exemple, si vos objets GUI sont liés à des ensembles de données et que vos objets métier fusionnent les modifications en ensemble de données, l'ensemble de données notifiera automatiquement aux objets gui que les données ont été modifiées; un objet de base de données IUG se mettra à jour automatiquement

sinon, le modèle d'observateur comme mentionné ci-dessus est ce que vous voulez

Questions connexes