我在Windows窗体上有几个绑定的控件,这些控件链接到另一个类的属性。更改任何一个控件的值时,将访问所有绑定属性的Getter。
类代码:
Public Class Student
Private _Name As String
Public Property Name As String
Get
Return _Name
End Get
Set(value As String)
_Name = value
End Set
End Property
Private _Grade As String
Public Property Grade As String
Get
Return _Grade
End Get
Set(value As String)
_Grade= value
End Set
End Property
Private _Age As Integer
Public Property Age As Integer
Get
Return _Age
End Get
Set(value As Integer)
_Age = value
End Set
End Property
End Class
表单代码:
Public Class Main
Public ThisStudent As New Student
Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Name_TextBox.DataBindings.Add("Text", Me.ThisStudent, "Name")
Me.Grade_TextBox.DataBindings.Add("Text", Me.ThisStudent, "Grade")
Me.Age_TextBox.DataBindings.Add("Text", Me.ThisStudent, "Age")
End Sub
End Class
仅当我在“名称”文本框中键入内容时,名称,等级和年龄的Getter都将被访问(实际上,我什至不知道为什么要为“ Name”本身访问Getter。只需设置名称)。在我的实际用例中,Getters进行了一些额外的验证,每当控件值发生更改时,数据绑定都将非常慢,然后它会检查与其他30个无关但绑定到完全不同的控件的属性的Getters。 / p>
我是否可以将多个控件绑定到同一对象中的属性,但是只能访问实际上绑定到该特定控件的属性?
答案 0 :(得分:1)
绑定到对象并更改数据绑定控件的bound属性的值时,默认情况下,所有绑定控件将重新加载其值,并调用属性的getter。
要停止此行为,可以将ControlUpdateMode
类的Binding
属性设置为Never
:
Me.Name_TextBox.DataBindings.Add("Text", Me.ThisStudent, "Name") _
.ControlUpdateMode = ControlUpdateMode.Never
Me.Grade_TextBox.DataBindings.Add("Text", Me.ThisStudent, "Grade") _
.ControlUpdateMode = ControlUpdateMode.Never
Me.Age_TextBox.DataBindings.Add("Text", Me.ThisStudent, "Age") _
.ControlUpdateMode = ControlUpdateMode.Never
您所说的话,切勿重新加载Name_TextBox
,Grade_TextBox
和Age_TextBox
。
如果出于任何原因要将数据源的值重新加载到控件中,则可以通过在相关的Binding
上调用ReadValue
方法来强制更新控件。
例如,要将ThisStudent
的所有值重新加载到相关的TextBox
控件中,可以使用以下代码:
BindingContext(ThisStudent).Bindings.Cast(Of Binding) _
.ToList().ForEach(Sub(x) x.ReadValue())