Tipps und Tricks rund um .NET und Visual Studio (Teil 2)
Kommentare

Fenster via ViewModel öffnen und manipulieren
Das Muster Model-View-ViewModel sieht die Trennung zwischen Präsentation und Logik vor, indem letzteres in so genannte ViewModels ausgelagert und über Datenbindung

Fenster via ViewModel öffnen und manipulieren

Das Muster Model-View-ViewModel sieht die Trennung zwischen Präsentation und Logik vor, indem letzteres in so genannte ViewModels ausgelagert und über Datenbindung lose an die View gebunden wird. Das ViewModel kennt die View somit nicht und kann deswegen separat entwickelt und vor allem automatisiert getestet werden. Allerdings müssen in einigen Fällen Methoden im ViewModel doch Änderungen in der View auslösen, zum Beispiel wenn ein neues Fenster oder ein Dialog geöffnet werden soll, oder wenn es das aktuelle Fenster zu ändern gilt. Um die automatisierte Testbarkeit durch Code, der sich mitten im ViewModel auf Fenster bezieht oder gar Popups öffnet, nicht zu gefährden, müssen Aktionen dieser Art abstrahiert werden.

Dazu wird zunächst ein Interface mit den gewünschten Aktionen erstellt. Listing 3 zeigt beispielhaft ein Interface, das lediglich zwei Vertreter dieser Aktionen anbietet: ShowDialog soll einen Dialog öffnen und SetTitle soll den Titel des Hauptfensters, das im Folgenden in Anlehnung an das bekannte Framework Prism [1] als Shell bezeichnet wird, ändern.

Listing 3
interface IShellService
{
    void ShowDialog(string message);
    void SetTitle(string title);
}  

Die Implementierung für den Produktivbetrieb der Anwendung wird in der Shell untergebracht. Die Shell ist somit das einzige Fenster, das Logik beinhaltet. Soll das vermieden werden, könnte die Shell-Implementierung auch in einer eigenen Klasse, die die Shell beim Programmstart übergeben bekommt, implementiert werden (Listing 4).

Listing 4
public partial class MainWindow : Window, IShellService
{
    public MainWindow()
    {
        this.DataContext = new SomeViewModel(this);
        InitializeComponent();
    }


    public void ShowDialog(string message)
    {
        MessageBox.Show(message);
    }


    public void SetTitle(string title)
    {
        this.Title = title;
    }
}  

Ein Blick in den Konstruktor der Shell verrät, dass die Shell selber an das ViewModel übergeben wird. Es beinhaltet, wie im Folgenden gezeigt, einen Konstruktor, der ein Objekt vom Typ IShellService erwartet. Die Shell wird somit als IShellService übergeben und das ViewModel weiß in diesem Fall auch nicht, dass es sich dabei um ein View-Element handelt. Damit die Verwaltung dieser Instanz nicht in jedem ViewModel separat realisiert werden muss, erbt es von der Basisklasse ViewModelBast, die sich darum kümmert (Listing 5).

Listing 5
class SomeViewModel : ViewModelBase
{
    public SomeViewModel(IShellService shellService): base(shellService)
    {
    }

    public void ShowDialog()
    {
        ShellService.ShowDialog("Hallo Welt!");
    }
    [...] 
}

class ViewModelBase
{
    protected IShellService ShellService { get; set; }

    public ViewModelBase(IShellService shellService)
    {
        this.ShellService = shellService;
    }
}  

Durch die Abstraktion mittels IShellService können ViewModels dieser Art nach wie vor automatisiert getestet werden. Dazu wird allerdings eine Dummy-Implementierung von IShellService benötigt. Sie würde zum Beispiel einen Zähler mitführen, der darüber informiert, wie häufig ein neuer Dialog angefordert wurde. Je nach Testfall könnte auch mitgeführt werden, um welche Dialoge es sich dabei gehandelt hat. Der Testfall würde diese Informationen in weiterer Folge verwenden, um herauszufinden, ob sich das getestete ViewModel beim Test wie gewünscht verhalten hat.

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer arbeiten bei www.IT-Visions.de als Softwarearchitekten, Berater und Trainer für .NET-Technologien. Dabei unterstützen sie zahlreiche Unternehmen beim Einsatz von .NET und entwickeln selbst in größeren Projekten. Sie haben zahlreiche Fachbücher geschrieben und gehören seit vielen Jahren zu den Hauptsprechern auf der BASTA!. Manfred Steyer ist zudem für den Fachbereich „Software Engineering“ der Studienrichtung „IT und Wirtschaftsinformatik“ an der FH CAMPUS 02 in Graz verantwortlich. Dr. Holger Schwichtenberg unterrichtet in Lehraufträgen an den Fachhochschulen Münster und Graz.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -