Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Windows窗体数据绑定控件访问所有属性的getter_.net_Vb.net_Winforms_Data Binding - Fatal编程技术网

.net Windows窗体数据绑定控件访问所有属性的getter

.net Windows窗体数据绑定控件访问所有属性的getter,.net,vb.net,winforms,data-binding,.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) _N

我在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
当我只在“Name”文本框中输入时,Name、Grade和Age的Getter都被访问(实际上我甚至不知道为什么要访问Name本身的Getter,因为它应该只是设置名称)。在我的实际用例中,getter正在执行一些额外的验证,这使得每当控件值更改时数据绑定非常慢,然后它会检查30+个其他不相关但绑定到完全不同控件的属性的getter


是否有一种方法可以将多个控件数据绑定到同一对象中的属性,但只能访问实际绑定到该特定控件的属性?

当绑定到对象并更改数据绑定控件的绑定属性值时,默认情况下,所有绑定控件都将重新加载其值,并调用属性的getter

要停止此行为,可以将类的属性设置为
从不

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\u TextBox
Grade\u TextBox
Age\u TextBox

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

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

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

另一种方法:在getter中不做任何“额外”操作,只返回值。如果您想进行一些验证,请在方法中进行验证,并从相应的控制事件调用它。这就是Winforms中MVVM失控的原因之一;)这是一个有趣的方法,我将不得不测试它。非常感谢。