この記事は公開から4年以上経過しています。
WPFをはじめ昨今ではWEB系でも定着してきたPDS開発でお馴染みの双方向データバインディングを、VB.NET(WinForms)で行なう手順です(C#でも方法は同様です)。
VisualStudioのコードビハインドも元来はPDSを保つための仕組みですが、コードビハインドの自由度が高すぎるためか意識的にバインディングが利用されていないのが実情です。
予め新規VB.NETのWinFormsプロジェクトのフォームに、2つのテキストボックスを配置している前提で説明しています。
手順
- INotifyPropertyChangedを実装するModelクラスを作成し、バインディングしたいプロパティを定義する。
- FormのコンストラクタのInitializeComponent()処理に続き、バインディングしたいコントロールのDataBindingsプロパティに、バインディング情報(View側プロパティ名、Modelオブジェクト、Model側プロパティ名)をBindingオブジェクトとして追加する。
サンプルソースコード(VB.NET)
Imports System.ComponentModel
Imports System.Runtime.CompilerServices
' プレゼンテーション
Public Class Form1
Private _model As New Model()
Public Sub New()
InitializeComponent()
' バインディング
TextBox1.DataBindings.Add(New Binding(NameOf(TextBox.Text), _model, NameOf(Model.Text)))
TextBox2.DataBindings.Add(New Binding(NameOf(TextBox.Text), _model, NameOf(Model.Text)))
End Sub
End Class
' ドメイン
Class Model
Implements INotifyPropertyChanged
Private _text As String
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
' データプロパティ
Public Property Text As String
Get
Return _text
End Get
Set(value As String)
If Not Object.Equals(_text, value) Then
_text = value
NotifyPropertyChanged()
End If
End Set
End Property
' プロパティ変更通知
Protected Sub NotifyPropertyChanged(<CallerMemberName> Optional propName As String = "")
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
End Sub
End Class
上記手順の完了後にプログラムを実行したとき、Form上の片方のTextBoxにテキストを入力してフォーカスを移動することで、もう片方のTextBoxに先程入力したテキストが表示されれば成功です。
ちなみに、上記例はバリデーションのタイミングでモデルが更新されますが、BindingクラスのコンストラクタでDataSourceUpdateMode.OnPropertyChanged
を指定すれば即時更新することも可能です。
参考ウェブサイトなど
-
Microsoft Docs
Windows フォームでのデータ バインディング -
Microsoft Docs
データ バインディング – .NET でデータ バインディングを適切に実装する方法
以上です。