Depurando Data Binding

Uno de los problemas con los que me encuentro a menudo, son las limitaciones que ofrece el lenguaje XAML a la hora de obtener información sobre un error. Voy a centrarme en la depuración de los Data Binding, debido a que son una parte importante de Windows Presentation Foundation y la detección de errores de los mismos se hace casi indispensable.

Tengo dos métodos para depurar los Binding:

  • Output Window de Visual Studio

     

    Tengo una aplicación que carga una serie de imágenes de un archivo XML, pero he utilizado mal el nombre de la propiedad que mostrará las distintas imágenes.

    <Image Source=»{Binding Path=PictureWrong}» Width=»300″ Height=»300″ Grid.Row=»0″/>

    Cada vez que no se vincula de forma correcta una imagen con la propiedad correspondiente se sobreimpresiona un mensaje de error del tipo:

    System.Windows.Data Error: 35 : BindingExpression path error: ‘PictureWrong’ property not found on ‘object’ «Star’ (HashCode=49535530)’. BindingExpression:Path=PictureWrong; DataItem=’Star’ (HashCode=49535530); target element is ‘Image’ (Name=»); target property is ‘Source’ (type ‘ImageSource’)

    De este modo visual Studio, me presenta la información necesaria para reconocer que la propiedad que enlazamos a una fuente de datos «Source», tomando los datos de forma inadecuada.

     

  • Trace Level

     

    Esta opción aparece en el Framework 3.5 y ayuda más aún a obtener al detalle los diferentes errores que se producen en los Data Binding. Por ejemplo tenemos un «TextBox», cuya propiedad «Text» será cambiada por el valor que le otorga la propiedad «Value» del control Slider a través de un Data Binding.

    <TextBox Text=»{Binding ElementName=slider, Path=Value, Mode=OneWay}» Height=»30″ Width=»100″ Margin=»10″ />

<Slider Minimum=»0″ Maximum=»100″ Value=»20″ Margin=»10″ x:Name=»slider» />

Para obtener toda la información y que esta se muestre en la output Window, debo introducir el espacio de nombres «System.Diagnostics» y en el Binding he de añadir «PresentationTraceSources.TraceLevel=High»

 

    <Window x:Class=»WpfApplication1.Window1″

        xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation»

        xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml»

        xmlns:trace=»clr-namespace:System.Diagnostics;assembly=WindowsBase»

        Title=»Window1″ Height=»300″ Width=»300″>

        <Grid>

<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» />

        </Grid>

</Window>

 

La ventana de depuración obtendrá resultados como este:

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’

 

 

 

Deja un comentario

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