我有两种形式Form1和Form2,在Form1上我有一个共享的BindingList,它也将被Form2使用,当Form1上的一个按钮点击它时,它会向绑定列表添加一个新对象并在新线程上打开Form2。
Friend Shared WithEvents AllObjects As New BindingList(Of MyObject)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Object1 As New MyObject With {.MyName = "I am One"}
Dim Object2 As New MyObject With {.MyName = "I am Two"}
Me.AllObjects.Add(Object1)
Me.AllObjects.Add(Object2)
Dim Thread = New Thread(Sub ()
Dim Frm2 As Form2 = New Form2()
Application.Run(Frm2 )
End Sub ))
Thread.SetApartmentState(ApartmentState.STA)
Thread.Start()
End Sub
MyObject Class包含一个绑定到Form2
上的标签之一的属性 Friend Class MyObject
Implements System.ComponentModel.INotifyPropertyChanged
Private Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private _myName as String
Public Property MyName As String
Get
Return _myName
End Get
Set(value As String)
_myName = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("MyName"))
End Set
End Property
Public Class Form2
Friend WithEvents MyOwnObject As MyObject
Private Sub Form2_Shown(sender As Object, e As EventArgs) Handles Me.Shown
MyOwnObject = Form1.AllObjects.Item(0)
Me.lblName.DataBindings.Add("Text", MyOwnObject , "MyName")
End Sub
End Class
当显示Form2时,lblMyName标签文本按预期成功显示“我是一个”。
现在问题从Form1开始我有另一个按钮,它改变了位于Form1上的绑定列表中两个对象的属性,但当我这样做时,得到一个跨线程操作无效的异常,试图解决最好的我的知识,但仍然得到相同的错误,任何人都可以帮助我如何调用绑定到位于另一个线程上的对象的Label?
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Me.AllObjects.Item(0).MyName = "I am now Three"
Me.AllObjects.Item(1).MyName = "I am now Four"
End Sub