← Zurück zu den Projekten

Dynamischer Dateninspektor in WPF

Kategorie: Desktopanwendung
Datum: Juni 2019
Platzhalter-Bild für das Beispielprojekt

Über dieses Projekt

Dies ist eine WPF Desktop Applikation zur Erstellung und Bearbeitung von großen Itemkollektionen für Rollenspiele, nach dem MVVC Pattern. Da Rollenspiele sehr schnell eine große Menge von modellierten Gegenständen erfordern (meist mehrere hundert oder sogar tausende), kommt man schnell an den Punkt wo es nichtmehr praktikabel ist jedes Item als einzelne Json Datei oder einzelne Klasse zu behandeln. Dieses Projekt baut auf einem Plattformunabhängigen RPG Framework auf, dass ich als Library für meine eigene Spieleentwicklung entwarf.

Der Hauptfokus der Applikation lag auf der Darstellung und Bearbeitung der voll modularisierten Item Klassen. Das Grundframework unterstützt außerdem dynamische Berechnungen von numerischen Wertungen für Items, damit Items automatisch in ihrer Nützlichkeit geranked werden können. Diese automatischen Berechnungen werden auch im Inspektor angezeigt und passen sich in Echtzeit an die eingegebenen Werte an. Um eine große Breite an Klassen im Inspektor darstellbar zu machen ohne sie explizit als ViewModel modellieren zu müssen, werden ViewModels automatisch anhand der Attribute der Klassen generiert. Die Code Generierung erfolgt mittels eines T4Template Files.

Hauptfunktionen

  • Datadriven Design: Alle für das Tool relevanten Daten werden aus der gegebenen C# Domäne automatisiert extrahiert. Keine separaten Dateien außer der gegebenen C# Domäne müssen geändert werden, dies reduziert den Aufwand bei Codeänderungen enorm.
  • Responsive Design: Die dynamischen readonly Felder werden in Echtzeit berechnet und angezeigt, wenn der Nutzer für die Berechnung relevante Felder ändert.
Das Bild zeit eine Übersicht über das Programm. Links ist eine baumstruktur der offenen Itemkollektion zu sehen und rechts ist ein detailierter Inspektor, der alle Felder des selektierten Items zeigt.

Der Inspektor(rechts) erstellt durch Analyse der Klasse des Ausgewählten Projektes eine Übersicht über alle Felder der Klasse. Dies geschieht rekursiv, sodass auch mehrfach geschachtelte Klassen im Inspektor verändert werden können.

Das Bild zeigt den Inspektor während der Nutzer ein neues Element zu einem Feld hinzufügen möchte. Hierbei erscheint ein Dropdown mit allen möglichen Grundelementen für das Feld und einer Suchleiste.

Auf Grundlage der geladenen C# Domäne werden dynamisch alle validen Klassen, die einem Feld hinzugefügt werden können der Suchmaske hinzugefügt. Der Nutzer kann diese in Echtzeit über die Suchleiste Filtern und eine Instanz der ausgewählten Klasse in das Feld instanziieren.

Die Attribute über den Feldern steuern die Darstellung im Inspektor. Die Attribute werden mittels Reflections ausgewertet und danach automatisiert in WPF Elemente konvertiert.

Herausforderungen

Eine der größten Herausforderungen war die dynamische Inspektor Gestaltung. Vor allem da durch die dynamisch berechneten readonly Felder, eine relativ komplexe dynamische Verkettung von Databindings notwendig war. Ich löste dieses Problem indem ich dynamisch ViewModels und Views für jede Klasse mit Hilfe von T4 Templates beim Laden der C# Domäne generiere. Dies erlaubte es mir mit statischen ViewModels und Views zu arbeiten ohne diese händisch für jede Klasse schreiben zu müssen.

Erkenntnisse

Es war ein interessantes Problem den dynamischen Inspektor zu Implementieren. Ich habe einiges über die Limitierungen von WPF und die Anwendung von T4 Templates gelernt, auch wenn die Anwendung der Templates in diesem Projekt sehr naiv war und ich Sie in zukünftigen Projekten weniger monolithisch designen würde.