Blogginlägg

Hitta dina Binding-fel

Av Cecilia Wirén | Blogg | 6 maj 2013

Alla som jobbar med WPF har många gånger skapat en binding som vid testkörning inte fungerar och sedan tillbringat en del tid med att gissa och testa olika varianter. När en binding är fel blir det nämligen inget exception fel som kastas som det blir med andra fel utan det bara sväljs av runtimen. Dock har felet fångats och ett meddelande har faktiskt skrivits. Om du tittar i Output fönstret nästa gång du får en binding som inte fungerar som den skall ser du att du har en text om vad som inte fungerar. Dock kommer det ut så mycket annat i detta fönster att det kan vara svårt att hitta just ditt fel. Önskvärt skulle ju vara att få detta på ett annat ställe eller ännu bättre få exception. Här har du två olika alternativ.

Få binding fel i en fil

I (System.Diagnostics.PresentationTraceSources) DataBindingSource.Listeners kollektionen kan du lägga in lyssnare som skall fånga upp databinding fel, redan nu ligger output-fönstret I denna kollektion. Men du kan också själv lägga till flera. TextWriterTraceListner är en av dem som du kan använda, då fångar du felen i en fil. I filen App.xaml.cs lägger du till följande funktion till klassen App.


static App()
{
var bindingErrorLoggingFile = "din sökväg till en fil";
System.Diagnostics.PresentationTraceSources.
DataBindingSource.Listeners.Add(new
TextWriterTraceListener(bindingErrorLoggingFile));
}

Få ett exception-fel

Om du istället vill få ett exception fel behöver du skriva en klass som går att lägga till listeners kollektionen och som när den får ett fel kastar exception. För att göra detta skapa en klass som ärver från TraceListner och som implementerar de funktioner som den basklassen kräver.

public class ExceptionTraceListner: TraceListener
{
public override void Write(string message) {}
public override void WriteLine(string message) {}
}

Sedan behövs en Exception klass som du kan kasta, visst duger någon av dem som finns men om du skriver en egen kan du utveckla den som du vill samt välja att fånga bara den i en try-catch.


public class BindingErrorException: Exception
{
public BindingErrorException(string message):base(message){}
}

Du kan nu välja att kasta detta exception när du fångar upp ett felmeddelande med din nya TraceListner (ExceptionTraceListner klassen). Jag rekommenderar även att lägga in ett DEBUG direktiv så att du inte får med detta beteende ut i produktion.


public override void WriteLine(string message)
{
#if DEBUG
throw new BindingErrorException(message);
#endif
}

Du behöver nu bara lägga till lyssnaren till DataBindingSources Listners kollektion. I filen App.xaml.cs (App.xaml.vb) lägg till följande funktion till klassen App


static App()
{
System.Diagnostics.PresentationTraceSources.
DataBindingSource.Listeners.Add(new ExceptionTraceListner());
}


Till inlägget