Un nivel mas a la hora de debug en Bindings de WPF

Hola en el articulo Debugeando los Binding de WPF, vimos varias opciones a la hora de debugear los bindings, la mas frecuente es verlos en el OutputWindow mediante mensajes que nos muestra en esta ventana cuando ejecutamos nuestra aplicación y tenemos un error en el binding.

Pero si queremos ir mas allá podemos crear nuestro propio listener para trazar los binding, tan solo tenemos que realizar nuestra clase que derive de DefaultTraceListener en la que utilizaremos la clase PresentationTraceSources para escuchar los Binding y mostrar por ejemplo un MessageBox cada vez que se produzca un error.

Lo importante de nuestra clase que vamos a llamar CustomBindingTraceListener es que debemos de añadirla a los listeners de DataBinding que se encuentran en PresentationTraceSources.DataBindingSource.Listeners, una vez añadido sobrescribimos los métodos Write y WriteLine de la clase que hemos heredado para tratar los mensajes de error.

El código de nuestra clase seria tan sencillo como

1 class CustomBindingTraceListener : DefaultTraceListener 2 { 3 private static CustomBindingTraceListener _Listener; 4 private StringBuilder _Message = new StringBuilder(); 5 6 private CustomBindingTraceListener() 7 { } 8 9 public static void SetTrace() 10 { 11 SetTrace(SourceLevels.Error, TraceOptions.None); 12 } 13 14 public static void SetTrace(SourceLevels level, TraceOptions options) 15 { 16 if (_Listener == null) 17 { 18 _Listener = new CustomBindingTraceListener(); 19 PresentationTraceSources.DataBindingSource.Listeners.Add(_Listener); 20 } 21 22 _Listener.TraceOutputOptions = options; 23 PresentationTraceSources.DataBindingSource.Switch.Level = level; 24 } 25 26 public static void CloseTrace() 27 { 28 if (_Listener == null) 29 { return; } 30 31 _Listener.Flush(); 32 _Listener.Close(); 33 PresentationTraceSources.DataBindingSource.Listeners.Remove(_Listener); 34 _Listener = null; 35 } 36 37 public override void Write(string message) 38 { 39 _Message.Append(message); 40 } 41 42 public override void WriteLine(string message) 43 { 44 _Message.Append(message); 45 46 var final = _Message.ToString(); 47 _Message.Length = 0; 48 49 MessageBox.Show(final, "Tienes un error en el binding", MessageBoxButton.OK, MessageBoxImage.Error); 50 } 51 }

Una vez que tenemos nuestra clase solo tenemos que llamar al método SetTrace para que empiece a funcionar.

 

 

 

 

Si ejecutamos la aplicación con un error de Binding obtendríamos

image

 

Lo cual es molesto a la hora de probar y obliga a nuestros desarrolladores a limpiar esos bindings que fallan pero que no se notan a la hora de ejecutar la aplicación.

 

Os dejo el código


Un comentario en “Un nivel mas a la hora de debug en Bindings de WPF”

  1. supongo que en silverlight / wp7 debe pasar algo parecido no? porque precisamente estoy trasteando el tema y no veas lo que da por saco… pones un .ItemsSource y si no lo haces bien el compilador no da ningún error…

    no se si tendrá relación con lo que tú comentas.

    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *