Kolumne: Silverlight Expertise

Implicit DataTemplates PropertyChanged-Event typsicher aufrufen und Windows-Live-Anwender authentifizieren
Kommentare

Die Silverlight-Kolumne „Silverlight Expertise“ des dot.NET Magazins präsentiert monatlich leckere Top-How-tos zum Thema Silverlight von Gregor Biswanger (www.dotnet-blog.net), sodass Einsteiger und Silverlight-Experten durch geballtes Wissen gesättigt werden. Neu dazu kommt jeweils ein How-to zur Windows-Phone-7-Entwicklung. Heute stehen auf der Menükarte „Implicit DataTemplates“, „PropertyChanged-Event typsicher aufrufen“ und „Mit Windows Live den Anwender authentifizieren“. Viel Spaß und einen guten Appetit!

Menü 1 für Einsteiger: Implicit DataTemplates

Ab Silverlight 4 können Styles mittels Implicit Styles ohne Key für alle definierten Steuerelemente verwendet werden. Mit Silverlight 5 wurde das Feature durch Implicit DataTemplates erweitert. Das ermöglicht eine automatische Zuweisung der DataTemplates an die ContentPresenter Controls. In einem Beispiel soll ein Datensatz von Personen mittels Data Binding in ein ContentControl geladen werden. Dazu wird eine Person Property in die MainPage.xaml.cs hinzugefügt und durch ein DependencyProperty erweitert. Im Konstruktor wird der DataContext und der Datensatz definiert. Listing 1 veranschaulicht das Beispiel.

Listing 1: In der MainPage.xaml.cs-Datei die Beispieldaten bereitstellen

public partial class MainPage : UserControl
{
    public static readonly DependencyProperty PersonProperty =
        DependencyProperty.Register("Person", typeof (Person), typeof (MainPage), null);

    public Person Person
    {
        get { return (Person) GetValue(PersonProperty); }
        set { SetValue(PersonProperty, value); }
    }

    public MainPage()
    {
        InitializeComponent();

        DataContext = this;

        Person = new Person
                     {
                         Company = "impuls Informationsmanagement GmbH",
                         Name = "Gregor Biswanger"
                     };
    }
}

public class Person
{
    public string Company { get; set; }
    public string Name { get; set; }
}  

Die MainPage.xaml wird durch ein ContentControl und ein DataTemplate erweitert. Das Property DataType bekommt dann den gewünschten Datentypen definiert, worauf das DataTemplate automatisch zum Einsatz kommen soll (Listing 2).

Listing 2: DataTemplates an Datentypen definieren


    
        
            
                
                
            
        
    

    
        
    
  
Menü 2 für Experten: PropertyChanged-Event typsicher aufrufen

Um XAML über Änderungen der Daten zu informieren, muss das INotifyPropertyChanged-Interface mit implementiertem PropertyChanged-Event in der Dateninstanz enthalten sein. Das Unschöne daran ist, dass man die Properties klassisch ausschreiben muss. Zudem definiert man im Setter-Bereich den Aufruf vom PropertyChanged-Event. Dieser Aufruf benötigt den Namen des Propertys als String-Wert. Das macht die Entwicklung nicht mehr typsicher. Beim ersten Problem kann die aspektorientierte Programmierung [1] weiterhelfen. Wenn allerdings aus bestimmten Gründen auf kein AOP-Framework gesetzt werden kann, helfen heutige MVVM-Frameworks weiter. Sie bieten mittels Lambda einen typsicheren Aufruf vom PropertyChanged-Event. Ein solches Framework kann allerdings ideal durch die Microsoft-Expression-Blend-4-MVVM-Features ersetzt werden. Ein großer Vorteil ist, dass der Code frei bleibt von MVVM-spezifischen Aspekten. Der Code wird somit lesbarer und angenehmer. Jedoch bietet Blend 4 keine anderweitige Lösung zum PropertyChanged-Event vom Sourcecode. Es können nur XAML-spezifische Punkte erfüllt werden, zum Beispiel das Reagieren von Events [2] oder das Ausführen von Animationen. Dazu kann man allerdings schnell eine eigene Lambda-Lösung implementieren. Als wiederverwertbare Lösung eignet sich eine abstrakte Klasse geradezu ideal. Sie erhält das benötigte INotifyPropertyChanged-Interface und implementiert den PropertyChanged-Eventaufruf. Zusätzlich soll eine weitere Methode die benötigte Lambda-Funktion [3] via Parameter zur Verfügung stellen (Listing 3).

Listing 3: Abstrakte Klasse mit implementiertem PropertyChanged-Event

public abstract class VMBase : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  protected void OnPropertyChanged(string propertyName)
  {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }

  protected void OnPropertyChanged(Expression> propertyExpression)
  {
    OnPropertyChanged(((MemberExpression)propertyExpression.Body).Member.Name);
  }
}  

Wie nun die VMBase-Klasse verwendet werden kann, zeigt Listing 4.

Listing 4: PropertyChanged-Eventaufruf mittels Lambda Expression

public class ViewModel : VMBase
{
  public string Title
  {
    get { return _title; }
    set
    {
      _title = value;
      OnPropertyChanged(() => Title);
    }
  }
  
  string _title;
}  
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -