J'ai deux fenêtres: a maîtriser fenêtre, et un détails fenêtre qui s'ouvre en double-cliquant sur unligne spécifique dans la grille de données de la fenêtre principale. Je souhaite actualiser le contrôle de la grille de données de la fenêtre principale lorsque les données de la fenêtre de détails sont enregistrées.
(Quelques détails non pertinents: chaque fenêtre hérite d'un BaseWindow
et possède sa propre copie d'une classe héritant d'EF5 DbContext
. J'ai ajouté un Save
événement à la classe partielle et remplacé SaveChanges
pour soulever cet événement chaque fois SaveChanges
est appelé. C'est en fait l'événement auquel j'attache un gestionnaire d'événements.)
Je sais que je peux le faire en attachant un gestionnaire d'événements au Save
un événement. Cependant, je n'ai aucune idée de l'ordre dans lequel les fenêtres seront fermées - si la fenêtre principale est fermée en premier, il y aura toujours une référence à elle conservée par l'instance de la fenêtre de détails.
Si j'écoute le Closing"/"Closed
événement de la fenêtre principale afin que je puisse dire quandrelâchez le gestionnaire attaché à l'événement "Save", j'aurai le même problème à l'envers - la fenêtre principale contiendra une référence à la fenêtre de détails même après la fermeture de la fenêtre de détails.
Je sais que je peux mettre en œuvre un WeakEventManager
comme décrit ici, mais j'aimerais savoir s'il existe une technique plus simple que je peux utiliser. (On m'a dit que j'avais tendance à trop compliquer les choses.)
(Je n'utilise pas MVVM.)
Réponses:
0 pour la réponse № 1WeakEventManager
ferait le travail, il suffit d'utiliser la version générique et il n'y a rien de compliqué à ce sujet. En termes de performances, cela devrait être parfaitement bien dans votre cas.
Une autre option serait de désinscrire le gestionnaire d'événements sur Closing
de la fenêtre principale de la fenêtre principale, comme vous l'avez dit.
Pour supprimer toutes les références lorsque la fenêtre de détails est fermée, désabonnez tous les gestionnaires d'événements de la fenêtre de détails lorsque la fenêtre de détails se ferme, en abonnant cette méthode à la Closing
un événement:
public OnClosing()
{
Delegate[] registeredDelegates = saveHandler.GetInvocationList();
foreach (Delegate d in registeredDelegates )
saveHandler-= (d as SaveDelegate);
}
où saveHandler est votre gestionnaire et SaveDelegate est votre type de délégué personnalisé.
Cela étant dit, si vous voulez vous débarrasser de votre image de surcomplication, ne vous en souciez pas ...