2010-10-26 13 views
28

WPF es un gran conjunto de herramientas, y XAML de enlace de datos es muy potente, pero a menudo me he encontrado con dificultades derivadas de su transparencia: Puede ser difícil para depurar un fallo de enlace de datos cuando no se lanzan errores.¿Existe una buena herramienta para depurar comportamientos/errores de enlace de datos de XAML en el tiempo de ejecución?

Por ejemplo, recientemente he tenido que cambiar una declaración Style así:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding TestProperty}" Value="False"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

En esto:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.TestProperty}" Value="False"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

Para que la propiedad DataGridRow a verse afectada. Sería increíblemente útil ver, en diseño o tiempo de ejecución, cuáles serían las implicaciones de vincularse a diferentes fuentes y RelativeSource s.

¿Existen tales herramientas/técnicas?

Respuesta

30

Usted puede utilizar PresentationTraceSources.TraceLevel propiedad adjunta de fijaciones para obtener el registro detallado en la salida durante el tiempo de ejecución.

En su caso, se vería así:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Value="False" Binding="{Binding DataContext.TestProperty, 
        RelativeSource={RelativeSource AncestorType=UserControl}, 
        PresentationTraceSources.TraceLevel=High}"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 
+5

Esto definitivamente ayudó - ¡aceptado! Para completar, ya que inspeccionar el árbol visual en tiempo de ejecución es una preocupación relacionada, también me gustaría señalar [Snoop] (http://www.blois.us/Snoop/) a cualquiera que permanezca ajeno a sus encantos. –

+1

La versión más reciente de Snoop se puede encontrar en CodePlex: http://snoopwpf.codeplex.com/ –

+0

Útil para mí fue el Tracelevel correcto en la ventana de resultados. Opciones> Depuración> Ventana de salida> Enlace de datos. Como se describe aquí: http://karlshifflett.wordpress.com/2010/06/24/visual-studio-2010-wpf-trace-settings-default-is-incorrect – uli78

3

Si ejecuta su aplicación bajo el depurador de Visual Studio, se informará de los errores de unión a la ventana de salida. Estos son muy informativos y deberían ayudarlo a rastrear cualquier error.

4

Bea Stollnitz tiene un blog muy informativo sobre debugging WPF bindings.

Si está utilizando Visual Studio 2010, que tendrá que update the default WPF trace setting.

+0

+1 Muchas gracias por señalar la necesidad de actualizar la configuración VS2010; Hubiera quemado mucho tiempo en eso. –

0

Otra opción en Visual Studio 2010 es poner un punto de interrupción en la unión. Esto se puede hacer fácilmente haciendo clic en la palabra clave de enlace y presionando F9 para establecer el punto de corte. La palabra clave de enlace se resaltará en rojo. Si se resalta un trozo más grande de texto, es posible que el punto de interrupción no funcione en el editor que está utilizando. Si esto sucede, intente hacer clic derecho en el archivo en el Explorador de soluciones, seleccione "Abrir con" y elija "Editor de código fuente (texto)".

Al llegar al punto de interrupción en tiempo de ejecución, se puede examinar usando la ventana locales depurador y ver lo que está enlazado.

+4

Esto no funciona para mí en Visual Studio 2010: al ver un archivo XAML, no aparecen opciones de punto de interrupción en el menú Depurar, y presionar F9 con el cursor en '{Encuadernación ...' no tiene ningún efecto. ¿Puedes aclarar qué estás haciendo (quizás con una captura de pantalla) para lograr esto? –

Cuestiones relacionadas