DataBinding - 基于输入启用切换

时间:2017-12-15 21:30:26

标签: vb.net winforms data-binding

我正在使用Visual Basic .NET开发一个Windows窗体应用程序,并且我希望根据TextBox中是否存在任何内容来切换Button的enabled属性。我尝试使用以下方法设置DataBinding:

ButtonBack.DataBindings.Add("Enabled", Me.TextBoxValue, "TextLength")

这成功禁用了Button,但无论何时在TextBox中输入任何内容,Button都不会被启用。如果可能的话,我宁愿通过DataBindings这样做,而不是在TextBox的TextChanged或Validating事件中手动设置Enabled属性。

2 个答案:

答案 0 :(得分:1)

正如@LarsTech在评论中所述,您需要使用TextBox类的属性来引发更改的通知。 Text属性是适当的属性。

您可以通过绑定严格执行此操作,但仍然需要使用事件处理程序。因此,我认为这种方法在处理TextBoxValue.TextChanged事件方面没有多大价值。

这样做的一种方法是使用Binding.Format Event将Text属性的字符串转换为布尔值,如果它包含任何字符。

Dim b As Binding = ButtonBack.DataBindings.Add("Enabled", Me.TextBoxValue, "Text", True, DataSourceUpdateMode.OnPropertyChanged)
AddHandler b.Format, Sub(s As Object, args As ConvertEventArgs) args.Value = Not String.IsNullOrEmpty(CStr(args.Value))

因为绑定是双向的,如果你的代码改变了ButtonBack.Enabled属性,它将把属性的字符串表示发送回TextBoxValue,它的文本将读为“True”或“False”。这不是理想的结果。为了纠正这种可能性,需要处理Binding.Parse Event

AddHandler b.Parse, Sub(s As Object, args As ConvertEventArgs) args.Value = Me.TextBoxValue.Text

答案 1 :(得分:1)

我通常通过“子类化”需要“new”属性的控件来实现这种自定义属性绑定,就像你的情况一样,TextBox需要一个HasLength布尔属性(或者你的名字)想要给它。)

这是MyTextBox.vb

Public Class MyTextBox
    Inherits TextBox

    Public Event HasLengthChanged As EventHandler

    Private _HasLength As Boolean
    Public Property HasLength() As Boolean
        Get
            Return _HasLength
        End Get
        Set(ByVal value As Boolean)
            If value <> _HasLength Then
                _HasLength = value
                OnHasLengthChanged()
            End If
        End Set
    End Property

    Public Sub New()
        _HasLength = False
    End Sub

    Protected Sub OnHasLengthChanged()
        RaiseEvent HasLengthChanged(Me, New EventArgs())
    End Sub

    Protected Overrides Sub OnTextChanged(e As EventArgs)
        MyBase.OnTextChanged(e)
        HasLength = Not (String.IsNullOrEmpty(Text))
    End Sub
End Class

这里是Form1.vb

Public Class Form1

    Protected Overrides Sub OnLoad(e As EventArgs)
        MyBase.OnLoad(e)

        ButtonBack.DataBindings.Add("Enabled", Me.MyTextBox1, "HasLength", True, DataSourceUpdateMode.OnPropertyChanged)

    End Sub

End Class

当然,您需要一个包含MyTextBox实例和常规Button实例的表单。

使用此方法,只要用户在文本框中键入内容,该按钮就会启用,一旦文本框变空,该按钮就会被禁用。请注意,我使用了DataSourceUpdateMode.OnPropertyChanged,以便在您键入时完成更新,而不仅仅是在文本框失去焦点时。

编辑:我想我会在.NET中添加一些关于PropertyNameChanged模式的背景信息。

有许多方法可以让观察者知道对象上的属性发生了变化,而且大部分时间我们都使用INotifyPropertyChanged接口,但对于控件,推荐的方法仍然是使用{{1模式,由.NET识别,因此Binding对象可以完成它的工作,并知道所需的属性何时发生了变化。

对于参与绑定的数据对象,建议使用

PropertyNameChanged

顺便说一句,INotifyPropertyChanged适用于Windows窗体和WPF。

作为参考MSDN:

https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-apply-the-propertynamechanged-pattern

编辑2:我是一名C#程序员,我已尽力应用我对VB.NET的剩余知识。任何错误都是因为我在VB中过于生疏。很抱歉给您带来不便,但我可以向您保证代码运行正常。