2009-04-14 6 views
3

Ich habe eine "partielle" Klasse in VB.NET. Die Hälfte davon wird automatisch von einem Code-Generierungstool generiert. Diese Hälfte implementiert INotifyPropertyChanged, sodass alle Eigenschaften in diesem Teil der partiellen Klasse das PropertyChanged-Ereignis auslösen.Wie gehst du mit einem Ereignis um, das in deiner Klasse in deiner eigenen Klasse ausgelöst wird?

In meinem "benutzerdefinierten" Teil der Klasse, deklariere ich eine andere Eigenschaft, die von einer der Eigenschaften in der automatisch generierten Seite abhängt. Wenn sich diese automatisch generierte Eigenschaft ändert, möchte ich daher auch ein PropertyChanged-Ereignis für meine benutzerdefinierte Eigenschaft auslösen, die davon abhängt.

Wenn ich in den generierten Teil der Klasse gehe und das Ereignis dort erstelle, wird das überschrieben, wenn ich diesen Teil jemals wieder erzeuge, also will ich das nicht machen. Ich würde lieber eine Ereignisbehandlungsroutine auf meiner Seite der partiellen Klasse hinzufügen, die überprüft, ob sich die generierte Eigenschaft geändert hat, und wenn dies der Fall ist, ein anderes Ereignis für meine benutzerdefinierte Eigenschaft auslösen.

Ich versuche, dies zu schreiben mein eigenes Event Haken, aber es funktioniert nicht:

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 

Ich nehme an, es ist, weil normalerweise würden Sie das Withevents Schlüsselwort verwenden, den Compiler zu sagen, dass Sie‘ Abonnieren von Ereignissen von diesem Objekt. Ich habe keine Ahnung, wie ich das in der Klasse machen soll, die das Event überhaupt aufzieht, oder ob das überhaupt möglich ist. die "Griffe Me.PropertyChanged" aus dem Event-Handler

+0

Haben Sie eine Kontrolle über den Code-Generator? –

+0

In diesem speziellen Fall, ja, aber ich habe andere Fälle, wo ich keine Kontrolle habe, und ich könnte immer noch das Problem dort haben. Ich habe deine frühere Antwort zu Partial Methods gesehen und angefangen, darüber nachzudenken. Es sieht so aus, als müsste ich die Code-Generierung ändern, um das zu erreichen. –

+0

Ein gutes Beispiel, wo Sie keine Kontrolle haben würden, sind ADO.NET Entities. –

Antwort

2

In Ihrem Konstruktor, müssen Sie etwas auf den Linien von

AddHandler PropertyChanged, addressof MyProperty_PropertyChangedHandler 

und entfernen, im Grunde Ihre Hinzufügen der Ereignishandler manuell

wo „Property "ist der Name des Ereignisses, das Sie fangen möchten.

UPDATE

Sie können das nicht tun, weil das das Ctor im automatisch generierten Teil der Klasse. So können Sie das folgende Idiom verwenden, um den Handler für Sie hinzuzufügen. Sie werden eine private Klasse innerhalb Ihrer Klasse angeben und sie als privates Mitglied in Ihrer neuen Klasse einfügen. Wenn das private Mitglied erstellt wird, fügen Sie den Handler für das Ereignis hinzu.

Das oben genannte ist ungetestet, aber ich habe das schon oft getan.

Hoffe es hilft :)

+0

Der Konstruktor ist im generierten Teil der Klasse ... –

+0

Ich mag das Update ... sieht aus wie Genie - ich werde es versuchen. –

+0

Es funktioniert immer noch nicht. Ein Haltepunkt in der ersten Zeile des Ereignishandlers wird nicht getroffen. –

Verwandte Themen