【入門編】実務中級者向け:VB.NETでの「INotifyPropertyChanged」インターフェイス実装:データバインディングの変更通知を自動化する設計術 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは!エンジニアとしてのステップアップを目指すあなたへ。

ここまで来たら、ボタンを押したら画面が変わる、文字を入力したら別の場所も連動して変わる……そんな「動的なUI」を自分の手でコントロールしたくなりますよね。

Windows FormsやWPFで開発をしていると、「背後のデータ(モデル)を書き換えたのに、画面の表示が古いまま変わらない!」という壁に必ずぶつかります。画面を一度最小化したり、別の画面を開き直したりすると直る、あのイヤな現象です。

今回は、その悩みを根底から解決し、プロのエンジニアとしての設計力を一段引き上げる「INotifyPropertyChanged」インターフェイスの活用術を伝授します。

ここをクリアすれば、Visual Basic (VB.NET)でのモダンなデータバインディングの基本はバッチリですよ!優しく紐解いていきますので、安心してついてきてくださいね。

1. なぜ「変更通知」が必要なのか?(UIとデータの関係)

私たちが普段作るアプリケーションは、基本的に「データ(Model)」「画面(View)」が分かれています。

例えば、ユーザーの「名前」を保持するクラスがあるとします。
コード側で `UserName = “山田”` と書き換えても、Windowsや.NETの裏側からすると、「おや、変数の中身が変わったぞ。画面のテキストボックスも書き換えるべきかな?」と勝手に気付いてはくれません。

ここで登場するのが `INotifyPropertyChanged` です。
こいつは、クラスにこう言わせるための「お約束(インターフェイス)」です。

> 「私のプロパティの値が書き換わったら、登録されている画面(UI)に向かって『ねえ、今の値に画面を更新して!』って叫ぶからね!」

この仕組みを作っておくことで、データと画面が常にガッチリ同期する、堅牢なアプリケーションが完成します。

2. 【基本の実装】INotifyPropertyChanged の骨組み

それでは、実際にVB.NETでこの仕組みを実装してみましょう。
まずは、一番シンプルかつ、現場で最もよく使われる王道の書き方を見てください。

Imports System.ComponentModel
Imports System.Runtime.CompilerServices

‘ 1. INotifyPropertyChanged インターフェイスを実装します
Public Class UserViewModel
Implements INotifyPropertyChanged

‘ 2. プロパティ値が変更されたときに発生するイベントを宣言
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

‘ 内部で保持するフィールド
Private _userName As String

‘ 3. 外部から触るプロパティ
Public Property UserName As String
Get
Return _userName
Get
Set(ByVal value As String)
‘ 値が変わっていない場合の無駄な処理を防ぐガード句
If _userName <> value Then
_userName = value
‘ 値が変化したことを通知するメソッドを呼び出す
OnPropertyChanged()
End If
End Set
End Property

‘ 4. 変更通知を発火させるヘルパーメソッド
‘ CallerMemberNameを使うことで、プロパティ名を文字列でハードコーディングせずに済みます!
Protected Sub OnPropertyChanged( Optional ByVal propertyName As String = Nothing)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub

End Class

ここがポイント!初心者が感動するテクニック

上記のコードにある `` 属性、これめちゃくちゃ便利なんです。
昔は `OnPropertyChanged(“UserName”)` のように、プロパティ名を文字列で指定していました。これだと、後からリファクタリングでプロパティ名を変更したときに、文字列の書き換えを忘れてバグの温床になっていました。

しかし、`` を使えば、そのメソッドを呼んだプロパティの名前を自動的にコンパイラが察知して代入してくれます。VB.NETのスマートな恩恵をたっぷり受けられる最高の書き方です。

3. 【実用編】複数のプロパティが連動する「依存プロパティ」の通知

実務では、「First Name(名)」と「Last Name(姓)」を合わせたら、「Full Name(フルネーム)」になる、といったケースが多々あります。
こういう場合、フルネーム側の変更通知はどうすればいいでしょうか?

賢いエンジニアなら、こう書きます。

Imports System.ComponentModel
Imports System.Runtime.CompilerServices

Public Class EmployeeViewModel
Implements INotifyPropertyChanged

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

Private _firstName As String
Private _lastName As String

‘ 名前のプロパティ
Public Property FirstName As String
Get
Return _firstName
End Get
Set(ByVal value As String)
If _firstName <> value Then
_firstName = value
OnPropertyChanged()
‘ ★重要:FirstNameが変わったら、Full Nameも変わったことを通知する!
OnPropertyChanged(NameOf(FullName))
End If
End Set
End Property

‘ 姓のプロパティ
Public Property LastName As String
Get
Return _lastName
End Get
Set(ByVal value As String)
If _lastName <> value Then
_lastName = value
OnPropertyChanged()
‘ ★重要:LastNameが変わったら、Full Nameも変わったことを通知する!
OnPropertyChanged(NameOf(FullName))
End If
End Set
End Property

‘ 読み取り専用のフルネームプロパティ
Public ReadOnly Property FullName As String
Get
Return $”{_lastName} {_firstName}”
End Get
End Property

Protected Sub OnPropertyChanged( Optional ByVal propertyName As String = Nothing)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub

End Class

ここがプロの技!

`FirstName` や `LastName` のセッター内で、`OnPropertyChanged(NameOf(FullName))` を明示的に呼んでいる点に注目してください。
これにより、画面側で `FullName` をバインドしているテキストボックスも、名や姓が変更された瞬間にピタッと連動して書き換わります。この連鎖をコントロールできるようになると、UI設計の自由度がグッと跳ね上がります。

4. 陥りやすい罠とエラー回避のポイント

ここで、実務で初心者がやりがちな「痛いミス」をいくつかシェアしておきます。

1. 無限ループの罠
セッターの中で `value` との比較(`If _userName <> value Then`)をサボると、変更通知が発火し、画面が再描画され、その過程でまた値が代入され……と、スタックオーバーフロー(無限ループ)を引き起こします。比較チェックは絶対に忘れないでください。
2. UIスレッド以外からの変更通知(クロススレッド例外)
バックグラウンドのタイマー処理や非同期処理(Async/Await)の中で直接プロパティを書き換えると、画面スレッド以外からの更新になり、クラッシュすることがあります。UIを更新する値の変更は、必ずUIスレッド(または適切なDispatcher)から行う配慮が必要です。

まとめ:設計の引き出しを増やそう

今回は、VB.NETにおける `INotifyPropertyChanged` の実装と、実務で役立つスマートな変更通知のテクニックを解説しました。

  • 変更通知は、データと画面を繋ぐ「命綱」
  • `` を使ってコードをスッキリ、安全に保つ
  • 連動するプロパティ(FullNameなど)は、追加で通知を発火させる

このパターンを一度自分のものにしてしまえば、Windows FormsであれWPFであれ、複雑な画面設計が驚くほどスムーズになります。「マクロの記録」や、ただ画面にコントロールをベタ貼るだけのコードとはおさらばです。

ぜひ、あなたのプロジェクトのViewModel層に取り入れて、ワンランク上の洗練されたVB.NETコードを書いてみてくださいね。
あなたのエンジニアライフを、これからも応援しています!

タイトルとURLをコピーしました