将TextBox正确绑定到对象属性

时间:2018-01-23 20:38:17

标签: vb.net data-binding textbox inotifypropertychanged

我有一个带有属性的类,我需要将其绑定到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绑定到可以预设并留在原位的类对象的属性。

1 个答案:

答案 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'