2009-04-14 8 views
3

J'ai une classe "partielle" dans VB.NET. La moitié est générée automatiquement par un outil de génération de code. Cette moitié implémente INotifyPropertyChanged, de sorte que les propriétés de cette partie de la classe partielle déclenchent l'événement PropertyChanged.Comment gérez-vous un événement déclenché dans votre classe à l'intérieur de votre propre classe?

Dans ma partie "personnalisée" de la classe, je déclare une autre propriété qui dépend de l'une des propriétés du côté généré automatiquement. Par conséquent, lorsque cette propriété générée automatiquement change, je souhaite également déclencher un événement PropertyChanged sur ma propriété personnalisée qui en dépend. Si j'entre dans la partie générée de la classe et que j'élève l'événement là-bas, cela sera écrasé si jamais je produis de nouveau cette partie, donc je ne veux pas faire ça. Je préfèrerais ajouter un gestionnaire d'événement de mon côté de la classe partielle qui vérifie si la propriété générée a changé, et si c'est le cas, déclencher un autre événement pour ma propriété personnalisée.

Je suis en train d'écrire ceci pour accrocher mon propre événement, mais il ne fonctionne pas:

Private Sub MyProperty_PropertyChangedHandler(_ 
     ByVal sender As Object, ByVal e As PropertyChangedEventArgs _ 
     ) Handles Me.PropertyChanged 
    Select Case e.PropertyName 
     Case "AutoGenProperty" 
      RaiseEvent PropertyChanged(Me, _ 
       New PropertyChangedEventArgs("MyProperty")) 
    End Select 
End Sub 

Je suppose que c'est parce que vous utilisez normalement le mot clé WithEvents pour indiquer au compilateur que vous » re souscrire à des événements de cet objet. Je n'ai pas la moindre idée de comment faire cela à l'intérieur de la classe qui soulève l'événement, ou même si c'est possible.

+0

Avez-vous un contrôle sur le générateur de code? –

+0

Dans ce cas particulier, oui, mais j'ai d'autres cas où je n'ai pas de contrôle, et je pourrais encore avoir le problème là. J'ai vu votre réponse plus tôt sur les méthodes partielles et commencé à regarder dans cela. Il semblerait que je devrais modifier la génération de code pour que cela fonctionne bien. –

+0

Un bon exemple où vous n'auriez pas de contrôle est ADO.NET Entities. –

Répondre

2

Dans votre constructeur, vous avez besoin quelque chose sur les lignes de

AddHandler PropertyChanged, addressof MyProperty_PropertyChangedHandler 

et enlever la « Poignées Me.PropertyChanged » de votre gestionnaire d'événements, essentiellement votre ajout du gestionnaire d'événements manuellement

où « PropertyChanged "est le nom de l'événement que vous voulez attraper.

MISE À JOUR

Vous ne pouvez pas faire cela parce que l'cteur est dans la partie générée automatiquement de la classe. Vous pouvez donc utiliser l'idiome suivant pour ajouter le gestionnaire pour vous. Vous allez spécifier une classe privée dans votre classe, et la mettre comme membre privé sur votre nouvelle classe, lorsque le membre privé est construit, vous ajoutez le gestionnaire pour l'événement.

Public Partial MyClass 
    private class MyInitialiser 
     public sub new(byval myParent as MyClass) 
      Addhandler myParent.PropertyChanged, addressof myParent.MyProperty_PropertyChangedHandler 
     end sub 
    end class 
    private _myInitialiser as new MyInitialiser(me) 
. . . 
End Class 

Ce qui précède n'a pas été testé, mais je l'ai fait beaucoup de fois auparavant.

Espérons que ça aide :)

+0

Le constructeur est dans la partie générée de la classe ... –

+0

J'aime la mise à jour ... ressemble à un génie - je vais essayer. –

+0

Cela ne fonctionne toujours pas. Un point d'arrêt sur la première ligne du gestionnaire d'événements n'est pas en cours d'exécution. –

Questions connexes