2009-04-22 11 views
9

De vez en cuando me parece que he roto accidentalmente el enlace de datos en mi aplicación. Ya sea por cambiar el nombre de una propiedad y no cambiar el nombre en el XAML o por una propiedad que arroja una excepción por alguna razón.¿Cómo propagar errores y excepciones que ocurren durante el enlace de datos de WPF?

De forma predeterminada, los errores de enlace de datos se registran en la salida de depuración y las excepciones que se lanzan son capturadas y suprimidas.

¿Hay una manera fácil de tener una excepción lanzada después de que se registra la salida de depuración?

Quiero saber lo antes posible si el enlace de datos está roto (lo ideal es recogerlo en una prueba automática) y no arriesgar la posibilidad de que pueda pasar desapercibido hasta que sea probado por un ser humano.

Respuesta

11

Después de algunas demoras finalmente me puse a codificar una solución a mi problema original.

Mi solución utiliza un TraceListener personalizado (sugerido originalmente por John) que inicia sesión en una ventana de resultados. La ventana de salida se muestra automáticamente y se compra al primer plano cuando ocurre un error.

Aquí es mi TraceListener:

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

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

TraceListener se define en System.Diagnostics.

El TraceListener personalizado debe estar enganchado en el sistema que se utilizará. La forma oficial de hacerlo es establecer algo en el registro y luego usar el archivo App.config para configurar el TraceListener.

Sin embargo he encontrado que hay una manera mucho más fácil de hacer esto mediante programación:

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

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

PresentationTraceSources también está definido en System.Diagnostics.

Para obtener más información sobre las fuentes de trazas, vea Mike Hillberg's blog.

Bea Stollnitz tiene alguna información útil sobre ella blog.

+1

Encontré que esto solo capta errores cuando se adjunta el depurador. Cuando el depurador no está conectado, WPF no emite los errores en primer lugar ... (?) ¿Alguien más ha experimentado esto? – pauldoo

+1

En una investigación posterior, es solo el comportamiento de enjuague que se altera cuando se conecta el depurador. Use 'System.Diagnostics.Trace.AutoFlush = true;' solucionó nuestro problema. – pauldoo

+2

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

2

Eche un vistazo a this blog article que puede ayudar a evitar este problema.

+0

Exactamente lo que yo hubiera publicado, excepto que no podía recordar el enlace ... – Benjol

+0

Este es un buen artículo sobre la depuración de problemas con los enlaces de datos.Pero depende de que hayas detectado los problemas en primer lugar, ¿verdad? Esta no es realmente la respuesta que estaba buscando. Lo que quiero (si es posible) es una descripción concisa de cómo hacer que los problemas vinculantes de datos se destaquen más en primer lugar. –

+0

Puede crear un escucha de seguimiento personalizado que arroje excepciones – John

0

he implementado una solución muy similar a la respuesta aceptada:

  1. Derivado un TraceListener que lanza en lugar de entrar
  2. añadió que escucha a PresentationTraceSources.DataBindingSource

Por favor ver la complete solution on GitHub, que incluye una aplicación de demostración y un proyecto de prueba de unidad.

Exception in Visual Studio

Cuestiones relacionadas