.NET Framework(WinForms)でコントロールバインディング

この記事は公開から4年以上経過しています。

WPFをはじめ昨今ではWEB系でも定着してきたPDS開発でお馴染みの双方向データバインディングを、VB.NET(WinForms)で行なう手順です(C#でも方法は同様です)。
VisualStudioのコードビハインドも元来はPDSを保つための仕組みですが、コードビハインドの自由度が高すぎるためか意識的にバインディングが利用されていないのが実情です。

予め新規VB.NETのWinFormsプロジェクトのフォームに、2つのテキストボックスを配置している前提で説明しています。


手順

  1. INotifyPropertyChangedを実装するModelクラスを作成し、バインディングしたいプロパティを定義する。
  2. 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 でデータ バインディングを適切に実装する方法

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする