2009-04-22 11 views
9

Ogni tanto scopro che ho interrotto accidentalmente l'associazione dei dati nella mia applicazione. O rinominando una proprietà e non rinominandola nell'XAML o in una proprietà generando un'eccezione per qualche motivo.Come propagare gli errori e le eccezioni che si verificano durante l'associazione dei dati WPF?

Per impostazione predefinita, gli errori di associazione dati vengono registrati per eseguire il debug dell'output e le eccezioni generate vengono prese e soppresse.

Esiste un modo semplice per generare un'eccezione dopo aver registrato l'output di debug?

Voglio sapere il prima possibile se l'associazione dei dati viene interrotta (idealmente la raccolta in un test automatico) e non rischiare la possibilità che passi inosservata fino a quando non viene testata da un essere umano.

risposta

11

Dopo un po 'di procrastinazione ho finalmente deciso di codificare una soluzione al mio problema originale.

La mia soluzione utilizza un numero personalizzato TraceListener (originariamente suggerito da John) che registra in una finestra di output. La finestra di output viene automaticamente visualizzata e acquistata in primo piano quando si verifica un errore.

Ecco il mio TraceListener:

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

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

TraceListener è definito in System.Diagnostics.

L'utente TraceListener deve essere collegato al sistema da utilizzare. Il modo ufficiale per farlo è impostare qualcosa nel registro e quindi usare il file App.config per configurare lo TraceListener.

Tuttavia ho trovato che c'è un modo molto più semplice per fare questo a livello di codice:

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

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

PresentationTraceSources è definita, System.Diagnostics.

Per ulteriori informazioni sulle fonti di traccia, vedere Mike Hillberg blog.

Bea Stollnitz ha alcune informazioni utili sul suo blog.

+1

Ho rilevato che questo rileva errori solo quando il debugger è collegato. Quando il debugger non è collegato, WPF non emette gli errori in primo luogo. (?) Qualcun altro ha riscontrato questo? – pauldoo

+1

In seguito a ulteriori indagini, è solo il comportamento del flusso che viene modificato quando viene collegato il debugger. Usa 'System.Diagnostics.Trace.AutoFlush = true;' risolve il problema. – pauldoo

+2

Per un esempio completo: http://www.jasonbock.net/jb/Default.aspx?blog=entry.0f221e047de740ee90722b248933a28d – Thomas

2

Dai uno sguardo allo this blog article che potrebbe aiutarti a risolvere questo problema.

+0

Esattamente quello che avrei postato, tranne che non riuscivo a ricordare il link ... – Benjol

+0

Questo è un buon articolo sul debug problemi con associazioni di dati.Ma dipende da te che hai rilevato i problemi in primo luogo, giusto? Questa non è davvero la risposta che stavo cercando. Quello che voglio (se è possibile) è una descrizione concisa di come rendere maggiormente evidenti i problemi di binding dei dati. –

+0

È possibile creare un listener di traccia personalizzato che genera eccezioni – John

0

ho implementato una soluzione molto simile alla risposta accettata:

  1. Derivato un TraceListener che getta invece di registrazione
  2. aggiunto che ascoltatore a PresentationTraceSources.DataBindingSource

Si veda il complete solution on GitHub, include un'applicazione demo e un progetto di test unitario.

Exception in Visual Studio

Problemi correlati