簡體   English   中英

Windows 窗體數據綁定控件訪問所有屬性的 Getter

[英]Windows Forms Databound Control Accessing Getters For All Properties

我在 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 都被訪問(實際上我什至不確定為什么要訪問“名稱”本身的 Getter,因為它應該只是設置名字)。 在我的實際用例中,Getter 正在執行一些額外的驗證,這使得每當控件值更改時數據綁定非常慢,然后它會檢查 30 多個不相關但綁定到完全不同控件的其他屬性的 Getter。

有沒有辦法將多個控件數據綁定到同一對象中的屬性,但只訪問實際綁定到該特定控件的屬性?

當您綁定到一個對象並更改數據綁定控件的綁定屬性的值時,所有綁定的控件將默認重新加載它們的值並調用屬性的 getter。

要停止此行為,您可以將Binding類的ControlUpdateMode屬性設置為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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM