我正在使用Visual Basic .NET开发一个Windows窗体应用程序,并且我希望根据TextBox中是否存在任何内容来切换Button的enabled属性。我尝试使用以下方法设置DataBinding:
ButtonBack.DataBindings.Add("Enabled", Me.TextBoxValue, "TextLength")
这成功禁用了Button,但无论何时在TextBox中输入任何内容,Button都不会被启用。如果可能的话,我宁愿通过DataBindings这样做,而不是在TextBox的TextChanged或Validating事件中手动设置Enabled属性。
答案 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
,以便在您键入时完成更新,而不仅仅是在文本框失去焦点时。
PropertyNameChanged
模式的背景信息。
有许多方法可以让观察者知道对象上的属性发生了变化,而且大部分时间我们都使用INotifyPropertyChanged
接口,但对于控件,推荐的方法仍然是使用{{1模式,由.NET识别,因此Binding对象可以完成它的工作,并知道所需的属性何时发生了变化。
PropertyNameChanged
。
顺便说一句,INotifyPropertyChanged
适用于Windows窗体和WPF。
作为参考MSDN:
编辑2:我是一名C#程序员,我已尽力应用我对VB.NET的剩余知识。任何错误都是因为我在VB中过于生疏。很抱歉给您带来不便,但我可以向您保证代码运行正常。