データバインディングのおべんきょ。その1。
データバインディングのおべんきょ。その2。
これまでのあらすじ。
「'プロパティ名' + Changed」 イベントの提供という方法でデータの変更をコントロールに通知する方法でした。
むむぅ・・・さらっと書けてしまって非常に不安です。ええ、とても。今回は、もう一つの方法です。こちらは .NET Framework 2.0 での対応なようですね。さくっと書きますと、
INotifyPropertyChanged インターフェイス の実装
だそうです。えぇ、インターフェイスです。名前からしてなんだかそれっぽいですね。MSDNでは、
MSDN:INotifyPropertyChanged インターフェイス(http://msdn2.microsoft.com/ja-jp/library/system.componentmodel.inotifypropertychanged(VS.80).aspx)
です。このリンク先に今回書く内容がさらっと書かれているので若干凹んでいますが、まぁいきましょう。前回の Person クラスを 今回は以下のように変更します。
Imports System
Imports System.ComponentModel
Public Class Person
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
Protected Overridable Sub NotifyPropertyChanged(ByVal propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
End Class
なんとなく、見た目は前回とあんまり変わらないですね。どうやら、このINotifyPropertyChanged インターフェイス、.NET Framework 2.0で追加されたようで、前回の「'プロパティ名' + Changed」 イベントに取って変わるシロモノのようです。さきほどのリンク先にも推奨って書かれてました。
解釈としては 「プロパティが変更されたことを通知する」ということを拾い上げた(?)ものでしょうか。PropertyChanged イベント自体はプロパティが変更されたことだけを通知し、イベントの引数である PropertyChangedEventArgs に変更されたプロパティの名前を設定することにより、通知される側はどのプロパティが変更されたかを判断する、ということですね。プロパティごとにプロパティ名 + Changed イベントを実装しなくてよくなるわけです。
早速実行してみてください。前回、Button2 をクリックすると内部で _person の Name プロパティを変更するようなコードになっていました。その Button2 をクリックして TextBox1 のText プロパティに 変更が反映されるか確認してみましょう。
みて!反映されてる!反映されてるよ!かぁちゃん!!
というわけで、INotifyPropertyChanged インターフェイス の実装という方法でデータの変更をコントロールに通知する方法でした。