【发布时间】:2018-07-02 18:49:57
【问题描述】:
我有一个带有属性的类,我需要将其绑定到 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 中的单元格会正确更新。我似乎无法让它与文本框一起使用。我看不出我可能会错过什么。谢谢。
编辑 - 更多信息:
经过进一步研究,我发现了一篇类似的帖子,其中提到在属性为 null 时绑定到类的属性会导致它不起作用。您必须在绑定之前有数据。
我在表单上添加了一个按钮并将绑定代码移到那里并在加载事件中将其注释掉。然后我加载表格。用数据填充 CurrentServoFormServoManager 对象,然后单击按钮将 TextBoxes 绑定到 CurrentServoFormServoManager 属性。那行得通。我可以以编程方式更改数据并更新文本框。
问题是。我不能真正将其用作解决方案。 CurrentServoFormServoManager 对象在此程序中不断被破坏和重新制作。一旦你把它变成 = 无或 = 到一个新的伺服对象,数据绑定就会中断并且必须重置。我不能这样做,因为该事件发生在表单控件之外。它是由在不同时间从串行端口传入的数据包触发的。 IE:我必须挂起表单才能等待串行数据包重新绑定数据。这就是我试图在代码中摆脱的解决方案。
我还尝试填充伺服对象,然后绑定文本框,然后只更新数据而不重建对象,并且可以从表单上的按钮更新,但是来自串行数据包的传入线程安全数据不会更新文本框。数据在对象属性中正确更新,通过 BindingList 绑定的数据网格更新正常,但 TextBoxes 不会。
所以...我仍然没有解决如何将 TextBoxes 绑定到可以预设并保留在适当位置的类对象的属性的解决方案。
【问题讨论】:
-
CurrentServoFormServoManager到底是什么? -
你使用的是什么 UI 框架?
-
我在 vb.net 中构建 Windows 窗体。 CurrentServoFormServoManager 只是 Servo 类的一个实例。哈哈。当我在研发期间尝试不同的事情时,我会使用长名称。
-
我认为您的代码没有任何问题。您可能无意中用另一个文本框在设计器中隐藏了
TextBoxCurrServoID。尝试将TextBoxCurrServoID.BringToFront()添加到您的 Form_Load 处理程序代码中。
标签: vb.net data-binding textbox inotifypropertychanged