Hallo zusammen.
Ich versuche mir gerade in WinForms eine Vereinfachung der
Dazu habe ich eine Testklasse, die eine generische und eine nichtgenerische Property hat. Beides sind nichtprimitive Klassentypen, beide haben ein abfeuerbereites Event, beide können angewiesen werden, ihr Event zu feuern.
Die Oberklasse stellt EventHandler bereit, um die Events der Properties zu Testzwecken abzufangen.
Lasse ich den Code ab Zeile#8 laufen, werden die Events der Properties gefeuert und von den EventHandlern abgefangen. Damit ist klar, dass die Events an sich funktionieren, die EventHandler ebenfalls.
Wird jedoch Z#15 ausgeführt, sagt mir der Debugger zwar, dass der Property-Setter ab Z#64 aufgerufen wird und auch Z#67 und Z#71-74 aufgerufen werden. Aber der zuständige EventHandler in Z#33 wird nicht aufgerufen, verpasst also seinen Einsatz. Was habe ich übersehen?
Spoiler anzeigen
##########
Führt man das Ganze mit einer nongenerischen Property aus, geht es. Hier ein einfaches Beispiel dafür:
Spoiler anzeigen
Ich versuche mir gerade in WinForms eine Vereinfachung der
INotifyPropertyChanged
-Implementierung zu basteln, scheitere jedoch am zuverlässigen Abfangen des Events.Dazu habe ich eine Testklasse, die eine generische und eine nichtgenerische Property hat. Beides sind nichtprimitive Klassentypen, beide haben ein abfeuerbereites Event, beide können angewiesen werden, ihr Event zu feuern.
Die Oberklasse stellt EventHandler bereit, um die Events der Properties zu Testzwecken abzufangen.
Lasse ich den Code ab Zeile#8 laufen, werden die Events der Properties gefeuert und von den EventHandlern abgefangen. Damit ist klar, dass die Events an sich funktionieren, die EventHandler ebenfalls.
Wird jedoch Z#15 ausgeführt, sagt mir der Debugger zwar, dass der Property-Setter ab Z#64 aufgerufen wird und auch Z#67 und Z#71-74 aufgerufen werden. Aber der zuständige EventHandler in Z#33 wird nicht aufgerufen, verpasst also seinen Einsatz. Was habe ich übersehen?
VB.NET-Quellcode
- Public Class FrmMain
- Dim TestInstance As Test = Nothing
- Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- TestInstance = New Test With {.GenericClassInstance = 123}
- End Sub
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- TestInstance.Initialize()
- TestInstance.RaiseTestEventOfNonGenericClassInstance()
- TestInstance.RaiseTestEventOfGenericClassInstance()
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- TestInstance.GenericClassInstance = 456
- End Sub
- End Class
- Public Class Test
- Property GenericClassInstance As New GenericClass(Of Integer)
- Property NonGenericClassInstance As New NonGenericClass
- Public Sub Initialize()
- AddHandler GenericClassInstance.TestEvent, AddressOf GenericClassInstanceTestEventHandler
- AddHandler NonGenericClassInstance.TestEvent, AddressOf NonGenericClassInstanceTestEventHandler
- End Sub
- Private Sub NonGenericClassInstanceTestEventHandler(sender As Object, e As EventArgs)
- MessageBox.Show("nongeneric event fired")
- End Sub
- Private Sub GenericClassInstanceTestEventHandler(sender As Object, e As EventArgs)
- MessageBox.Show("generic event fired")
- End Sub
- Public Sub RaiseTestEventOfNonGenericClassInstance()
- NonGenericClassInstance.RaiseTestEvent()
- End Sub
- Public Sub RaiseTestEventOfGenericClassInstance()
- GenericClassInstance.RaiseTestEvent()
- End Sub
- End Class
- Public Class NonGenericClass
- Public Event TestEvent As EventHandler
- Public Sub RaiseTestEvent()
- MessageBox.Show("nongeneric event firing")
- RaiseEvent TestEvent(Me, New EventArgs)
- End Sub
- End Class
- Public Class GenericClass(Of T)
- Public Event TestEvent As EventHandler
- Private _Value As T
- Public Property Value As T
- Get
- Return _Value
- End Get
- Set
- If _Value.Equals(Value) Then Return
- _Value = Value
- RaiseTestEvent()
- End Set
- End Property
- Public Sub RaiseTestEvent()
- MessageBox.Show("generic event firing")
- RaiseEvent TestEvent(Me, New EventArgs)
- End Sub
- Public Shared Widening Operator CType(Value As GenericClass(Of T)) As T
- Return Value.Value
- End Operator
- Public Shared Widening Operator CType(Value As T) As GenericClass(Of T)
- Return New GenericClass(Of T) With {.Value = Value}
- End Operator
- Public Overrides Function ToString() As String
- Return Value.ToString
- End Function
- End Class
##########
Führt man das Ganze mit einer nongenerischen Property aus, geht es. Hier ein einfaches Beispiel dafür:
VB.NET-Quellcode
- Public Class FrmMain
- Dim EasyTest As EasyTest
- Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- EasyTest = New EasyTest With {.TestProperty = 123}
- AddHandler EasyTest.TestEvent, AddressOf TestEventHandler
- End Sub
- Private Sub TestEventHandler()
- MessageBox.Show("got it")
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- EasyTest.TestProperty = 222
- End Sub
- End Class
- Public Class EasyTest
- Private _TestProperty As Integer
- Public Event TestEvent()
- Public Property TestProperty As Integer
- Get
- Return _TestProperty
- End Get
- Set
- _TestProperty = Value
- RaiseTestEvent()
- End Set
- End Property
- Public Sub RaiseTestEvent()
- RaiseEvent TestEvent()
- End Sub
- End Class
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()