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
Cuando desarrollamos en WPF, los binding son indispensables y a veces tenemos problemas con ellos que
Muy interesante para ilustrar el proceso interno de busqueda, validación y conversion de valores en el proceso de binding.
Enhorabuena.
Si recordáis mi articulo de http://geeks.ms/blogs/oalvarez/archive/2009/07/22/debugeando-los-binding
Hola en el articulo Debugeando los Binding de WPF , vimos varias opciones a la hora de debugear los bindings