Debugeando los Binding de WPF

Cuando desarrollamos en WPF, los binding son indispensables y a veces tenemos problemas con ellos que no somos capaces de detectar y deseamos con todo el alma poder poner un breakpoint y tener la posibilidad de debugear con todas las herramientas que nos da Visual Studio.

Pero esto no es posible y para poder ver los errores de binding y poderlos analizar tenemos diferentes alternativas

Output window

En la ventana Output de Visual Studio donde se displayan todos los mensajes, cuando se produce un error de binding se muestra en esta ventana el error como por ejemplo

System.Windows.Data Error: 35 : BindingExpression path error: ‘Password1’ property not found on ‘object’ »LoginViewModel’ (HashCode=28756230)’. BindingExpression:Path=Password1; DataItem=’LoginViewModel’ (HashCode=28756230); target element is ‘TextBox’ (Name=’Password’); target property is ‘Text’ (type ‘String’)

 

Usar un converter

Si con el mensaje no conseguimos ver el problema una opción es crear un converter y cambiar el bindign al converter. En el converter si podemos poner un punto de ruptura y ver el valor que entra al Binding

 

Crear una Dependency Property

Otra opción es crear una DependencyProperty y poner un punto de ruptura

 

TraceLevel

PresentationTraceSources.TraceLevel es una clase que te permite enviar a la ventana de Output mucha mas información del DataBinding, podemos monitorizar todos los pasos que se producen en un Binding, para habilitarlo tenemos que añadir el namespace System.Diagnostics y en el binding añadir PresentationTraceSources.TraceLevel=High. Esta opción aparece a partir de la versión 3.5

 

<Window x:Class="DebugBindings.Window1"... xmlns:trace="clr-namespace:System.Diagnostics;assembly=WindowsBase">
<StackPanel>
<TextBox Text="{Binding ElementName=slider, Path=Value, Mode=OneWay, trace:PresentationTraceSources.TraceLevel=High}" Height="30" Width="100" Margin="10"/>
<Slider Minimum="0" Maximum="100" Value="20" Margin="10" x:Name="slider" />
StackPanel>
Window>

En la ventana de Output aparecerá

Created BindingExpression (hash=17654054) for Binding (hash=44624228)

Path: ‘Value’

BindingExpression (hash=17654054): Default update trigger resolved to LostFocus

BindingExpression (hash=17654054): Attach to System.Windows.Controls.TextBox.Text (hash=52727599)

BindingExpression (hash=17654054): Resolving source

BindingExpression (hash=17654054): Found data context element: (OK)

Lookup name slider: queried TextBox (hash=52727599)

BindingExpression (hash=17654054): Resolve source deferred

BindingExpression (hash=17654054): Resolving source

BindingExpression (hash=17654054): Found data context element: (OK)

Lookup name slider: queried TextBox (hash=52727599)

BindingExpression (hash=17654054): Activate with root item Slider (hash=54371668)

BindingExpression (hash=17654054): At level 0 – for Slider.Value found accessor DependencyProperty(Value)

BindingExpression (hash=17654054): Replace item at level 0 with Slider (hash=54371668), using accessor DependencyProperty(Value)

BindingExpression (hash=17654054): GetValue at level 0 from Slider (hash=54371668) using DependencyProperty(Value): ’20’

BindingExpression (hash=17654054): TransferValue – got raw value ’20’

BindingExpression (hash=17654054): TransferValue – implicit converter produced ’20’

BindingExpression (hash=17654054): TransferValue – using final value ’20’

If I now enter text in the TextBox, I can check the Output Window to confirm that the binding was indeed broken!

BindingExpression (hash=17654054): Deactivate

BindingExpression (hash=17654054): Replace item at level 0 with {NullDataItem}

BindingExpression (hash=17654054): Detach

4 comentarios sobre “Debugeando los Binding de WPF”

Deja un comentario

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