我有一个带有属性的类,我需要将其绑定到VB.NET中的表单TextBox。到目前为止,我没有尝试从对象属性实时更新TextBox。
我的课程中有以下代码
Public Class Servo
Implements System.ComponentModel.INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Private _ServoID As Integer
Property ServoID() As Integer
Get
Return _ServoID
End Get
Set(ByVal Value As Integer)
_ServoID = Value
Call LoadModelInfo()
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("ServoID"))
End Set
End Property
End Class
在表单加载事件中,我有绑定代码
TextBoxCurrServoID.DataBindings.Add("Text", CurrentServoFormServoManager, "ServoID", False, DataSourceUpdateMode.OnPropertyChanged)
类的对象在模块中声明为全局变量
Public CurrentServoFormServoManager As RobotModel2.Servo = New RobotModel2.Servo
对象/类工作正常,我可以从它的属性中写入和读取数据,没有问题。如果我附加/创建一个BindingList并将其设置为DataGridView的数据源,则DataGridView中的单元格会正确更新。我似乎无法使用TextBox。我无法看到自己可能缺少的东西。感谢。
编辑 - 更多信息:
经过进一步的研究后,我发现了一个类似的帖子,其中提到在属性为null时绑定到类的属性会导致它无法工作。你必须在绑定之前有数据。
我在表单上添加了一个按钮,并在那里移动了绑定代码,并在load事件中对其进行了注释。然后我加载表单。使用数据填充CurrentServoFormServoManager对象,然后单击按钮将TextBoxes绑定到CurrentServoFormServoManager属性。这很有效。我可以通过编程方式更改数据和TextBoxes更新。
问题是。我不能真正用它作为解决方案。对象CurrentServoFormServoManager在此程序中不断被销毁并重新制作。只要你对一个新的伺服对象没有或=,数据绑定就会中断并且必须重置。我不能这样做,因为该事件发生在表单控件之外。它是由在不同时间从串口进入的数据包触发的。 IE:我必须挂起表单才能等待串行数据包然后重新绑定数据。这就是我试图摆脱代码的解决方案。
我还尝试填充伺服对象,然后绑定TextBox,然后只更新数据而不重建对象,并且可以从表单上的按钮更新,但来自串行数据包的传入线程安全数据不会更新文本框。数据在对象属性中正确更新,并且通过BindingList绑定的数据网格更新正常,但TextBoxes赢了。
所以...我仍然没有解决方法如何将TextBoxes绑定到可以预设并留在原位的类对象的属性。
答案 0 :(得分:0)
可能不是最佳解决方案,但如果您正在创建和销毁Servo
个对象(即不断更改CurrentServoFormServoManager
引用),那么您可能需要一个容纳Servo
的容器类通过委托引用和公开其属性,然后在引用或属性更改时引发事件。
e.g。容器类:
Imports System.ComponentModel
Public Class ServoContainer
Implements System.ComponentModel.INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Private WithEvents _servo As Servo
Sub New()
_servo = New Servo
End Sub
Property Servo As Servo
Get
Return _servo
End Get
Set(value As Servo)
_servo = value
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("ServoID"))
End Set
End Property
Private Sub _servo_PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Handles _servo.PropertyChanged
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("ServoID"))
End Sub
Property ServoID As Integer
Get
Return _servo.ServoID
End Get
Set(value As Integer)
_servo.ServoID = value
End Set
End Property
End Class
实例化容器:
Public CurrentServoContainer As ServoContainer = New ServoContainer
替换当前的文本框绑定,如下所示:
TextBoxCurrServoID.DataBindings.Add("Text", CurrentServoContainer, "ServoID", False, DataSourceUpdateMode.OnPropertyChanged)
现在,以下两行都将更新文本框:
CurrentServoContainer.Servo.ServoID = 99
和
CurrentServoContainer.Servo = New Servo With {.ServoID = 98} 'replace with your actual constructor'