データバインディングのおべんきょ。その6。
今回は前回に続き、要素の変更に対して行った変更をコントロールに反映させる方法を一つ書きます。今回もそれほど難しくありません。ListChanged イベントを発生させる方法の一つです。
それって、ずばり!!
INotifyPropertyChanged インターフェイス の実装
です。どっかで見ましたよね?このインターフェイス。そうです、その3でやりましたよね?あ、もちろん
BindingList ではなく、その要素に対してです。さっそく実装してみましょう。
Imports System.ComponentModel
Public Class WankumaEntertainer
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) _
Implements INotifyPropertyChanged.PropertyChanged
Private _name As String = String.Empty
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
If _name = value Then
Exit Property
End If
_name = value
Me.NotifyPropertyChanged("Name")
End Set
End Property
Public Sub New()
End Sub
Public Sub New(ByVal name As String)
Me.Name = name
End Sub
Public Sub New()
End Sub
Protected Overridable Sub NotifyPropertyChanged(ByVal propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
End Class
今回の作業はこれでおしまいです。Form1 には変更はありません。(←前回やった BindingList.ResetBindings メソッドの呼び出しは必要ありません、という意味です。)念のため、以下のコードになります。
Imports System
Imports System.ComponentModel
Public Class Form1
Private _entertainerList As BindingList(Of WankumaEntertainer)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Me._entertainerList = New BindingList(Of WankumaEntertainer)
Me._entertainerList.RaiseListChangedEvents = True
Me._entertainerList.Add(New WankumaEntertainer("ぽぴ王子"))
Me._entertainerList.Add(New WankumaEntertainer("アクア"))
Me._entertainerList.Add(New WankumaEntertainer("R・田中一郎"))
Me.ComboBox1.DataSource = Me._entertainerList
Me.ComboBox1.DisplayMember = "Name"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me._entertainerList.Add(New WankumaEntertainer("とりこびと"))
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
For Each entertainer As WankumaEntertainer In Me._entertainerList
If entertainer.Name = "とりこびと" Then
entertainer.Name = "とりこびと(仮)"
End If
Next
End Sub
End Class
とってもラクチンですね。ただ、どうしてこれでOKなのかは書いておきます。
BindingList クラスは要素の型が INotifyPropertyChanged インターフェイス を実装している場合、INotifyPropertyChanged.PropertyChanged イベントをハンドルして ListChanged イベントを発生してくれるようなのです。
とっても便利ね♪
ではでは、実行してみてください♪Button1 をクリックして 'とりこびと' を追加し、Button2 をクリックして変更してみてください。でもってその後 ComboBox1 のリストを確認してみてください。
でけた!でけたでぇ!どうでっしゃろ!?
というわけで、BindingList とINotifyPropertyChanged インターフェイス の実装の組み合わせという方法で要素の変更に対して行った変更をコントロールに反映させる方法でした。