私は通常、あなたの場合のように、「新しい」プロパティを必要とするコントロール「サブクラス」によって結合カスタムプロパティのこの種を実装するには、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
を使用して、テキストボックスのフォーカスが失われたときだけでなく、入力時に更新が行われるようにしました。
EDIT:.NETのPropertyNameChanged
パターンに関する背景を少し追加したいと思っていました。
オブジェクトでプロパティが変更され、ほとんどの場合、INotifyPropertyChanged
インターフェイスを使用しますが、コントロールに対しては、PropertyNameChanged
のパターンを使用することをお勧めしますしたがって、Bindingオブジェクトはそのジョブを実行し、目的のプロパティがいつ変更されたかを知ることができます。
INotifyPropertyChanged
は、バインディングに参加するデータオブジェクトにお勧めします。
ところで、PropertyNameChanged
はWindowsフォームとWPFの両方で動作します。
https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-apply-the-propertynamechanged-pattern
EDIT 2:私はC#のプログラマーだ、と私はVB.NETの私が持っている残留知識を適用するために最善をやった参照MSDNとして
。すべてのエラーは、私がVBで錆びすぎているという結果です。ご迷惑をおかけして申し訳ありませんが、コードはここでうまく動作します。
WinFormsには、データバインディングに関して多くの制限があります。 TextLengthは、何かが変更されたという通知を提供しない読み取り専用のプロパティです。 'AddHandler TextBoxValue.TextChanged、Sub()ButtonBack.DataBindings(0).ReadValue()End Sub'を追加することで不正行為をすることができます。これは、DataBindingを使用しないほうが良いということは、痛ましいことです。 – LarsTech