[英]How to implement a Properties window style control/system in Windows Forms?
[英]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_TextBox
, Grade_TextBox
和Age_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.