2009-04-22 3 views
9

Hin und wieder stelle ich fest, dass ich die Datenbindung in meiner Anwendung versehentlich unterbrochen habe. Entweder durch Umbenennen einer Eigenschaft und nicht durch Umbenennen in XAML oder durch eine Eigenschaft, die aus irgendeinem Grund eine Ausnahme auslöst.Wie können Fehler und Ausnahmen, die während der WPF-Datenbindung auftreten, weitergegeben werden?

Standardmäßig werden Datenbindungsfehler in der Debugausgabe protokolliert und Ausnahmen, die ausgelöst werden, werden abgefangen und unterdrückt.

Gibt es eine einfache Möglichkeit, eine Ausnahme auszulösen, nachdem die Debug-Ausgabe protokolliert wurde?

Ich möchte so schnell wie möglich wissen, ob die Datenbindung unterbrochen ist (idealerweise in einem automatisierten Test) und riskiere nicht die Gefahr, dass sie unbemerkt bleibt, bis sie von einem Menschen getestet wird.

Antwort

11

Nach einigem Zögern begann ich endlich, eine Lösung für mein ursprüngliches Problem zu programmieren.

Meine Lösung verwendet eine benutzerdefinierte TraceListener (ursprünglich von John vorgeschlagen), die in einem Ausgabefenster protokolliert. Das Ausgabefenster wird automatisch angezeigt und beim Auftreten eines Fehlers in den Vordergrund gebracht.

ist hier mein TraceListener:

public class ErrorLogTraceListener : TraceListener 
{ 
    public override void Write(string message) 
    { 
     ... 
    } 

    public override void WriteLine(string message) 
    { 
     ... 
    } 
} 

TraceListener in System.Diagnostics definiert.

Die benutzerdefinierte TraceListener muss in das zu verwendende System eingebunden werden. Der offizielle Weg, dies zu tun, ist, etwas in der Registrierung zu setzen und dann die App.config Datei zu verwenden, um das TraceListener zu konfigurieren.

Allerdings fand ich, dass es eine viel einfachere Art und Weise ist dies programmatisch zu tun:

ErrorLogTraceListener listener = new ErrorLogTraceListener(); 
PresentationTraceSources.Refresh(); 

PresentationTraceSources.DataBindingSource.Listeners.Add(listener); 
PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.Error; 

PresentationTraceSources auch in System.Diagnostics definiert ist.

Weitere Informationen zu Spurenquellen finden Sie in Mike Hillbergs blog.

Bea Stollnitz hat einige nützliche Informationen über sie blog.

+1

Ich habe festgestellt, dass dies nur Fehler erkennt, wenn der Debugger angeschlossen ist. Wenn der Debugger nicht angeschlossen ist, gibt WPF die Fehler an erster Stelle nicht aus. (?) Hat jemand anderes dies erfahren? – pauldoo

+1

Bei weiteren Untersuchungen wird nur das Löschverhalten geändert, wenn der Debugger angeschlossen ist. Verwenden Sie 'System.Diagnostics.Trace.AutoFlush = true;' hat unser Problem behoben. – pauldoo

+2

Für ein vollständiges Beispiel: http://www.jasonbock.net/jb/Default.aspx?blog=entry.0f221e047de740ee90722b248933a28d – Thomas

2

Werfen Sie einen Blick auf this blog article, die dazu beitragen können, dieses Problem zu umgehen.

+0

Genau das, was ich geschrieben hätte, außer ich den Link nicht erinnern konnte ... – Benjol

+0

Dies ist ein guter Artikel über Probleme Debuggen mit Datenbindungen.Aber es hängt davon ab, dass Sie die Probleme von Anfang an erkannt haben, oder? Dies ist nicht wirklich die Antwort, die ich suchte. Was ich will (wenn es möglich ist), ist eine kurze Beschreibung, wie man datenbin- dende Probleme an erster Stelle noch deutlicher hervorheben kann. –

+0

Sie könnten einen benutzerdefinierten Trace-Listener erstellen, der Ausnahmen auslöst – John

0

ich eine Lösung sehr ähnlich wie die akzeptierte Antwort implementiert:

  1. Abgeleitet ein TraceListener, die anstelle der Protokollierung
  2. hinzugefügt führt, dass Zuhörer PresentationTraceSources.DataBindingSource

Bitte geben Sie die complete solution on GitHub sehen, es enthält eine Demo-Anwendung und ein Unit-Test-Projekt.

Exception in Visual Studio

Verwandte Themen