Deine Klasse MVCPattern soll der Controller sein.
Dann solte da nichts mit dem View drin passieren.
Ersteinmal deine Client Klasse sollte u.a. dies beinhalten.
Public Class MVC_Client
Public Delegate Sub OnChangedDelegate(ByVal cl As MVC_Client)
Public Event OnChanged As OnChangedDelegate
'Irgendwelche Funbktionen die was machen und dann eben auch
Private Sub ChangeHandler()
If (OnChangedEvent IsNot Nothing) Then
OnChangedEvent(Me)
End If
End Sub
Private m_TestString As String
Public WriteOnly Property TestString() As String
Set(ByVal value As String)
m_TestString = value
ChangeHandler()
End Set
End Property
End Class OnChangedEvent ist eine automatisch generierte Variable, die Du nicht per Intellisence bekommst.
Das ist das DelegateArray des Events OnChanged.
jetzt kommt der Controller. Der ist etwas komplexer, da er das Invoken mit übernehmen muss/sollte.
Imports System.ComponentModel
Public Class MVC_Controller
Private clients As New List(Of MVC_Client)()
Public Delegate Sub OnAddingHandler(ByVal sender As MVC_Controller, ByVal cl _
As MVC_Client, ByRef cancel As Boolean)
Public Delegate Sub OnChangeHandler(ByVal sender As MVC_Controller, ByVal cl _
As MVC_Client)
' für onAdded, onRemoving, OnRemoved das gleiche machen
Public Event OnAdding As OnAddingHandler
Public Event OnChange As OnChangeHandler
Public Sub add(ByVal cl As MVC_Client)
Dim CancelIt As Boolean = False
Dim handler As OnAddingHandler = OnAddingEvent
If (handler IsNot Nothing) Then
' Hier ein paar tricks. Du kannst mehr als einen Handler installieren,
' also
' müssen wir bei jedem überprüfen, ob wir Invoken müssen
For Each singleCast As OnAddingHandler In handler.GetInvocationList()
Dim syncInvoke As ISynchronizeInvoke = TryCast(singleCast.Target, _
ISynchronizeInvoke)
Try
If ((syncInvoke IsNot Nothing) AndAlso (syncInvoke.InvokeRequired)) _
Then
syncInvoke.Invoke(singleCast, New Object() {Me, cl, CancelIt})
Else
singleCast(Me, cl, CancelIt)
End If
Catch ex As Exception
End Try
Next
End If
If CancelIt = False Then
clients.Add(cl)
'Und hier hängen wir uns in das onChangeEvent des Clients ein
AddHandler cl.OnChanged, AddressOf ClientChanged
End If
End Sub
Private Sub ClientChanged(ByVal cl As MVC_Client)
Dim handler As OnChangeHandler = OnChangeEvent
If (handler IsNot Nothing) Then
For Each singleCast As OnChangeHandler In handler.GetInvocationList()
Dim syncInvoke As ISynchronizeInvoke = TryCast(singleCast.Target, _
ISynchronizeInvoke)
Try
If ((syncInvoke IsNot Nothing) AndAlso (syncInvoke.InvokeRequired)) _
Then
syncInvoke.Invoke(singleCast, New Object() {Me, cl})
Else
singleCast(Me, cl)
End If
Catch ex As Exception
End Try
Next
End If
End Sub
End ClassUnd dein View ist jetzt einfach.
Public Class MVC_View
Private myController As New MVC_Controller
Public Sub New()
AddHandler myController.OnAdding, AddressOf OnAddingHandler
AddHandler myController.OnChange, AddressOf OnChangeHandler
End Sub
Private Sub OnAddingHandler(ByVal sender As MVC_Controller, ByVal cl As _
MVC_Client, ByRef cancel As Boolean)
' Hier zum LisView hinzufügen
End Sub
Private Sub OnChangeHandler(ByVal sender As MVC_Controller, ByVal cl As _
MVC_Client)
'Hier threadsave das ListView ändern
End Sub
private sub Testit
Dim mc As New MVC_Client
myController.add(mc)
mc.TestString = "Na schaun wir mal"
End Sub
End Class Wenn Du jetzt ein Client zu myController hinzufügst, und dann änderst,
kannst du mal die Abläufe verfolgen. |