Durch Zufall bin ich darüber gestolpert. In Windows 8 Projekten legt Visual Studio 11 im Common Verzeichnis eine Klasse BindableBase an. Diese kapselt, auch dank eines neuen Attributes CallerMemberName in .NET 4.5, sehr elegant den Code für die Implementierung des Event Systems.
Dies ist nötig um den View, als das per XAML definierte Userinterface, über Änderungen an den Daten zu informieren.
Der bisherige Ansatz implementiert das Interface INotifyPropertyChanged in der Viewmodell Klasse. Dann wird das Event per RaiseEvent für jede Eigenschaft einzeln gefeuert. Aber nur wenn die Daten sich auch geändert haben.
Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs)
Implements INotifyPropertyChanged.PropertyChanged
Private _BenutzerName As String
Public Property BenutzerName() As String
Get
Return _BenutzerName
End Get
Set(ByVal value As String)
If _BenutzerName <> value Then
_BenutzerName = value
RaiseEvent PropertyChanged(Me,
New PropertyChangedEventArgs("BenutzerName"))
End If
End Set
End Property
End Class
Auch wenn das Raisevent in der Praxis meist in eine Methode OnPropertyChanged gekapselt wird, noch ganz schien viel Code.
Nun zum Vergleich der ungleich schönere Code mit der geerbten BindableBase Implementierung. Vor allem die unschöne und von Intellisense nicht unterstützte Schreibweise mit dem PropertyName als String fällt weg.
Public Class PersonViewModel
Inherits BindableBase
Private _BenutzerName As String
Public Property BenutzerName() As String
Get
Return _BenutzerName
End Get
Set(ByVal value As String)
_BenutzerName = value
SetProperty(_BenutzerName, value)
End Set
End Property
Das VB.NET Codebeispiel wurde in WinRT geschrieben, sollte auch in .NET 4.5 Windows Desktop Anwendungen funktionieren.