easy Datenbindung MVVM und XAML

Ich erinnere mich noch recht gut an meine ersten Silverlight Schulungen. Das Thema zwei Wege Datenbindung und die Benachrichtigungsevents ans Userinterface, war für den Kursteilnehmer immer etwas mühsam. Nun komme ich aus einem Vortrag auf der #ADCX und hab ganz Beiläufig fody kennen gelernt. Und die Welt ist schöner geworden.

Zur Erinnerung: Um einem Model die Fähigkeit zu geben, eine Änderung der Daten dem User Interface mitzuteilen, muss das Interface INotfiyPropertyChanged implementiert werden. Pro Eigenschaft muss dann das ProperChanged Event, mit dem Namen des Propertys als String Argument, ausgelöst werden. Mal abgesehen von der Tipperei, eine perfekte Fehlerquelle. Mit .net 4.0 wurde dann das CallermemberAttribut eingeführt, das dem Compiler erlaubt, den Wert zuzuweisen. In Silverlight 5 muss man einen Trick verwenden, um das Attribut überhaupt nutzen zu können.

   1:  <AttributeUsageAttribute(AttributeTargets.Parameter, Inherited:=False)>
   2:  Public NotInheritable Class CallerMemberNameAttribute
   3:      Inherits Attribute
   4:  End Class

Ohne obigen Code wird folgender VB.NET Code in einem Silverlight Projekt nicht kompilieren

   1:  Public Class person
   2:      Implements INotifyPropertyChanged
   3:      Property id As Integer
   4:      Private _name As String
   5:      Public Property name() As String
   6:          Get
   7:              Return _name
   8:          End Get
   9:          Set(ByVal value As String)
  10:              _name = value
  11:              OnPropertyChanged()
  12:          End Set
  13:      End Property
  14:   
  15:      Protected Sub OnPropertyChanged(<CallerMemberName> 
Optional propertyName As String = Nothing)
  16:          RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
  17:      End Sub
  18:      Public Event PropertyChanged(sender As Object, 
e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
  19:  End Class

 

Die Zwei Wege Bindung wird nur für das Property name implementiert. Es muss die Langform mit Getter und Setter verwendet werden um in letzteren das Änderungs Event auszulösen (Zeite 11). Der Compiler ersetzt in Zeile 11 den Wert des Parameters propertyName mit “name”.

Es gib wohl Menschen die sich den Gedanken der Compiler Services noch tiefer zu Gemüte geführt haben. Auf Basis von Fody existiert ein Plugin für NotifyPropertyChanged, das man sich per Nuget in seine Visual Studio Projekt installieren kann.

image

Ab jetzt ist es nur noch geli einfach. Aus je zehn Zeilen Code wird eine. Es reicht eine Klassenattribut einzufügen und die verkürzte Propertysyntax.

   1:  <ImplementPropertyChanged>
   2:  Public Class person
   3:      Property id As Integer
   4:      Property name As String
   5:  End Class
Der Compiler erzeugt daraus im wesentlichen die Langversion des Codes, wie im vorigen Beispiel demonstriert.

PS fast auf den Tag genau vier Jahre sind vergangen seit Bob Muglia beiläufig Silverlight für Tod erklärte. Nur drei Monate später musste Bob der damalige Chef von Server und Tools seinen Stuhl räumen. HTML5 reicht auch heute noch bei weitem nicht an Silverlight heran.

Kommentare sind geschlossen