【问题标题】:Windows Forms Databound Control Accessing Getters For All PropertiesWindows 窗体数据绑定控件访问所有属性的 getter
【发布时间】:2019-06-29 15:41:10
【问题描述】:

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

当我仅在“姓名”texbox 中键入时,姓名、等级和年龄的 Getter 都被访问(实际上我什至不确定为什么要为“姓名”本身访问 Getter,因为它应该只是设置名称)。在我的实际用例中,Getter 进行了一些额外的验证,这使得每当控件值更改时数据绑定非常慢,然后它会检查 30 多个其他不相关但绑定到完全不同控件的属性的 Getter。

有没有办法让我将多个控件数据绑定到同一个对象中的属性,但只访问实际绑定到该特定控件的属性?

【问题讨论】:

  • 另一种方法:在 getter 中不做任何“额外”操作,只返回值。如果您想做一些验证,请在方法中进行并从对应的控件事件中调用它。

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


【解决方案1】:

当您绑定到一个对象并更改数据绑定控件的绑定属性的值时,所有绑定的控件将默认重新加载其值并调用属性的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())

【讨论】:

  • 这是 Winforms 中的 MVVM 失控的原因之一 ;)
  • 这是一个有趣的方法,我将不得不对其进行测试。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多