Windows窗体数据绑定控件访问所有属性的获取器

时间:2019-02-05 18:31:16

标签: .net vb.net winforms data-binding

我在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>

我是否可以将多个控件绑定到同一对象中的属性,但是只能访问实际上绑定到该特定控件的属性?

1 个答案:

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

如果出于任何原因要将数据源的值重新加载到控件中,则可以通过在相关的Binding上调用ReadValue方法来强制更新控件。

例如,要将ThisStudent的所有值重新加载到相关的TextBox控件中,可以使用以下代码:

BindingContext(ThisStudent).Bindings.Cast(Of Binding) _
    .ToList().ForEach(Sub(x) x.ReadValue())