MVVM mit weniger Code

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.

Kommentar schreiben