In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertisen: „WPF: Data Binding Debugging“, „WPF: Data Binding auf Events“ und „WPF: Das TextBox-Wasserzeichen-Behavior“. Viel Spaß mit XAML Expertise.
Das Debuggen von Data Binding ist seit der Geburtsstunde von XAML ein unangenehmer Aspekt. Bei einer falschen Data-Binding-Deklaration lässt sich ein WPF-Projekt ohne Probleme erzeugen. Erst zur Laufzeit wird im Output-Fenster ein Fehler angezeigt. In Visual Studio 2015 wurde daher das Setzen eines Breakpoints im XAML ermöglicht. Dies wurde in Visual Studio 2017 allerdings aufgrund technischer Schwierigkeiten wieder entfernt. Als neue Lösung zur genaueren Diagnose wird das Live Visual Tree Tooling zur Debugginglaufzeit angeboten. Dennoch muss der Data-Binding-Fehler nach wie vor über das Outputfenster entdeckt werden, damit daraufhin die neuen Tools zum Einsatz kommen können.
Eine effektive Lösung für dieses Problem ist die PresentationTraceSources-Klasse. Sie ermöglicht ein kontrolliertes Aktivieren der XAML-Trace-Informationen. Diese legt man am besten zum Programmstart in der App.xaml.cs-Datei fest (Abb. 1). In Listing 1 ist zu sehen, wie sie aktiviert werden. Zum Schreiben der Tracinginformationen wurde zusätzlich ein Trace Listener geschrieben und hinterlegt.
Wichtig: Am besten hinterlegt man zusätzlich mit #IF DEBUG in einer Compilerdirektive, ob die PresentationTraceSources gerade aktiv sein soll. Ansonsten kann es zu großen Performanceproblemen kommen, wenn die PresentationTraceSources unnötig im Hintergrund mitläuft.
Listing 1: Mit „PresentationTraceSources“ und einem „XamlTraceListener“ einen Break beim Debuggen verursachen
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
#if DEBUG
PresentationTraceSources.Refresh();
PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.Error;
PresentationTraceSources.DataBindingSource.Listeners.Add(new XamlTraceListener());
#endif
}
}
public class XamlTraceListener : TraceListener
{
public override void Write(string message)
{}
public override void WriteLine(string message)
{
Trace.WriteLine(message);
Debugger.Break();
}
}
Die Implementierung des Entwurfmusters MVVM (Model View ViewModel) bringt einen enormen Vorteil mit sich: die hundertprozentige Trennung von Design- und Businesslogik mittels Data Binding. Im ViewModel wird die Oberfläche anhand von Properties abgebildet. Dabei gelten für Aktionen wie das Auslösen eines einfachen Buttons, dass das Handling mittels Commands umgesetzt wird. Hier stoßen wir allerdings auch auf einen großen Nachteil: Commands beschränken sich nur auf die gängigen Standardaktionen. Dabei wird zum Beispiel nur beim Betätigen eines Buttons das Command ausgelöst. Bei einer ListView wäre dies wiederum die Auswahl eines Items.
Ein weiteres Problem ist die Tatsache, dass man leider auf keine weiteren Events der Steuerelemente reagieren kann. In manchen Situationen können die Informationen zwar über CommandParameter übertragen werden; die Problematik mit den fehlenden...