调用绑定到位于不同线程上的Object属性的Label Control

时间:2017-03-13 21:59:53

标签: vb.net multithreading binding invoke

我有两种形式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

0 个答案:

没有答案