Wer Datenbindung in seinen WPF-Anwendungen häufig benötigt, wird kennen, wie mühsam die Suche nach einem Fehler sein kann. Dabei bietet das .NET Framework hilfen, um derartigen Fehlern schnell auf die Spur zu kommen. Ganz ohne Tools.
Im .NET Framework 3.5 gibt es die Klasse PresentationTraceSources aus dem NamespaceSystem.Diagnostics. Dieses bietet uns die Möglichkeit, Traces von bestimmten Bereichen anzapfen zu können. Es werden zwei Wege geboten, auf diese Traces zuzugreifen:
- Durch die Registrierung des Startup-Ereignisses der Application können die notwendigen Angaben in dessen Eventhandler getätigt werden.
- Die Angabe der Traces kann auch über die Applikations-Konfigurations-Datei vorgenommen werden. Dies bietet den Vorteil, dass diese Funktion ohne großem Aufwand aktiviert bzw. deaktiviert werden kann.
Aber sehen wir uns dazu ein Beispiel an, welches die entsprechenden Angaben via Code tätigt.
Dazu verwenden wir ein Fenster mit einem DockPanel und einer ListView mit drei Spalten. Daran sollen Daten gebunden werden.
1: <DockPanel>
2: <ListView x:Name="PeopleList">
3: <ListView.View>
4: <GridView>
5: <GridViewColumn
6: Header="ID"
7: DisplayMemberBinding="{Binding Id}"/>
8: <GridViewColumn
9: Header="LastName"
10: DisplayMemberBinding="{Binding Lastname}"/>
11: <GridViewColumn
12: Header="FirstName"
13: DisplayMemberBinding="{Binding FirstName}"/>
14: </GridView>
15: </ListView.View>
16: </ListView>
17: </DockPanel>
Um die Daten zu halten, wird eine Klasse Person verwendet:
1: public class Person
2: {
3: public Int64 Id { get; set; }
4: public String FirstName { get; set; }
5: public String LastName { get; set; }
6: }
Hier fällt vielleicht auf, dass das Binding für die Eigenschaft LastName via XAML fehlerhaft angegeben wurde. In diesem einfachen Fall ist es nicht schwer, den Fehler zu finden. Bei komplexeren Aufgaben ist schon wesentlich mehr Aufwand notwendig.
Um dem Problem einfach auf die Spur zu kommen, wird das Startup-Ereignis der Anwendung registriert. Dies passiert in der Datei App.xaml:
1: <Application x:Class="PresentationTraceDemo.App"
2: xmlns="..."
3: xmlns:x="schemas.microsoft.com/winfx/2006/xaml"
4: StartupUri="MainWindow.xaml"
5: Startup="Application_Startup">
6: <Application.Resources>
7:
8: </Application.Resources>
9: </Application>
Im Eventhandler verwenden wir nun PresentationTraceSources, um die Ablaufverfolgung für die Datenbindung zu nutzen. Dazu leiten wir diese auf unsere Konsole um und defnieren einen Level. Dieser definiert, welche Daten aufgefangen und geschrieben werden:
1: private void Application_Startup(
2: object sender,
3: StartupEventArgs e)
4: {
5: PresentationTraceSources.DataBindingSource.Listeners.Add(
6: new ConsoleTraceListener());
7: PresentationTraceSources.DataBindingSource.Switch.Level =
8: SourceLevels.Critical : SourceLevels.Error : SourceLevels.Warning;
9: }
Wenn wir nun die Anwendung starten, ist sie folgendermaßen zu sehen:
Es ist schön zu sehen, dass die Spalte LastName nicht befüllt wurde. Zwar einfach zu erkennen, werfen wir jetzt allerdings einen Blick in die Konsole. Hier sollte nun eine Nachricht zu finden sein, die uns auf einen Fehler in der Datenbindung aufmerksam macht:
System.Windows.Data Error: 39 :
<br />BindingExpression path error: 'Lastname' property not found on 'object' ''Person' (HashCode=23686174)'.
<br />BindingExpression:Path=Lastname; DataItem='Person' (HashCode=23686174);
<br />target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
Damit können nun auch komplexere Fehler gefunden werden.
Fazit
Es lohnt sich auf jeden Fall, sich auch die weiteren Möglichkeiten von PresentationTraceSources anzusehen, da darüber sehr viele hilfreiche Informationen bezogen werden. Viele der vorhandenen Tools greifen ebenfalls auf diese Quelle zu.
Nachfolgend stehe eine Demoanwendung zur Verfügung, die obiges Beispiel abbildet. Es lohnt sich auch ein Blick in die MSDN. Dort ist zudem zu finden, wie obiges via Applikations-Konfigurations-Datei konfiguriert werden kann.