Tipps und Tricks zum MVVM-Pattern (Teil 4)
Kommentare

Auch die in diesem Artikel verwendete Beispielanwendung benutzt zum Laden von Personen Data-Provider. Dazu ist das Interface IPersonDataProvider definiert, das die entsprechenden Load-Methoden enthält:
public

Auch die in diesem Artikel verwendete Beispielanwendung benutzt zum Laden von Personen Data-Provider. Dazu ist das Interface IPersonDataProvider definiert, das die entsprechenden Load-Methoden enthält:

public interface IPersonDataProvider
{
  List LoadPersonLists();
  List LoadPersons(int personListID);
}  

Das Interface wird von der Klasse PersonDataProvider implementiert, die die Personendaten via Entity Framework aus der Datenbank lädt (Listing 7).

public class PersonDataProvider : IPersonDataProvider
{
  ...
  public List LoadPersons(int personListID)
  {
    var ctx = new PersonenDBEntities();
    var query = from person in ctx.Person
                where person.PersonListID == personListID
                select person;
    return query.ToList();
  }
}    

Ebenfalls wird das Interface von der Klasse PersonDesignDataProvider implementiert. Diese Klasse erstellt in der Methode LoadPersons einfach eine Liste mit vier Person-Objekten (Listing 8).

public class PersonDesignDataProvider : IPersonDataProvider
{
  ...
  public List LoadPersons(int personListID)
  {
    var list = new List();
    list.Add(new Person { FirstName = "Silvester", LastName = "Stallone");
    list.Add(new Person { FirstName = "Cameron", LastName = "Diaz" });
    list.Add(new Person { FirstName = "Sean", LastName = "Penn" });
    list.Add(new Person { FirstName = "Sharon", LastName = "Stone" });
    AddImages(list);
    return list;
  }
  ...
}  

Das ViewModel nutzt zum Erstellen eines DataProviders die PersonDataProviderFactory-Klasse bzw. deren statische Methode GetPersonDataProvider (Listing 9). Darin wird geprüft, ob die Anwendung sich im Designmodus befindet. Falls ja, wird eine PersonDesignDataProvider-Instanz zurückgegeben, ansonsten eine PersonDataProvider-Instanz.

public class PersonDataProviderFactory
{
  public static IPersonDataProvider GetPersonDataProvider()
  {
    if (DesignerProperties.GetIsInDesignMode(new FrameworkElement()))
      return new PersonDesignDataProvider();
    return new PersonDataProvider();
  }
}  

Im MainViewModel wird direkt im Konstruktor die LoadPersons-Methode aufgerufen, falls sich das MainViewModel im Designmodus befindet. In der LoadPersons-Methode wird der Design-Data-Provider erstellt und die entsprechenden Personen in einem PersonViewModel gekapselt sowie zur _persons Collection hinzugefügt (Listing 10).

public class MainViewModel : ViewModelBase
{
  ...
  public MainViewModel()
  {
    ...
    if (DesignerProperties.GetIsInDesignMode(new FrameworkElement()))
    {
      LoadPersons(1);
      _personsDefaultView.MoveCurrentToFirst();
    }
  }
  ...
  private void LoadPersons(int personListID)
  {
    _persons.Clear();
    IPersonDataProvider dataProvider = PersonDataProviderFactory.GetPersonDataProvider();
    foreach (Person p in dataProvider.LoadPersons(personListID))
    {
      _persons.Add(new PersonViewModel(p));
    }
  }
  ...
}  

Wird das Window, das dieses MainViewModel verwendet, nun in einem Werkzeug wie Expression Blend geöffnet, werden die im PersonDesignDataProvider definierten Personen angezeigt (Abb. 6). Ein DataTemplate lässt sich aufgrund dieser Designdaten sehr leicht in Expression Blend erstellen.

Abb. 6: Das Model-View-ViewModel-Pattern
Abb. 6: Das Model-View-ViewModel-Pattern
Wie geht’s weiter?

Das MVVM-Pattern bietet einige Stellen, an denen die Umsetzung nicht auf den ersten Blick klar ist. Dieser Artikel hat versucht, einige dieser Stellen klarzustellen. Im Endeffekt macht ein Entwickler alles richtig, wenn seine ViewModels „unit-testbar“ sind, der Designer das UI hervorragend in Expression Blend bearbeiten kann und die Codebehind-Dateien der Fenster außer Event Handlern zum Anzeigen von Dialogen keine Logik enthalten.

Thomas Claudius Huber arbeitet als Senior Consultant und Trainer bei der Trivadis AG. Nach seinem umfassenden Handbuch zur WPF hat er kürzlich auch sein umfassendes Handbuch zu Silverlight fertiggestellt. Nähere Informationen dazu unter www.thomasclaudiushuber.com/silverlight.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -