WPF : Débogage des bindings [ajout]
Par amethyste le Oct 16, 2009 | Dans focus | Réagir »
Les bindings c’est réellement une des forces de WPF. Mais parfois ils peuvent ne pas fonctionner ou bien ne pas charger le résultat attendu.
Comment faire pour obtenir des informations de plus bas niveau que de simplement constater que cela ne marche pas ?
Dans le cas où une exception est levée, le plus simple est de faire View/Output et regarder ce qui se passe dans la console de sortie. On va par exemple trouver ceci :
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=zoomSlider'. BindingExpression:Path=Value; DataItem=null; target element is 'ScaleTransform' (HashCode=34917486); target property is 'ScaleX' (type 'Double')
Parfois ce n’est pas suffisant ou bien le binding ne lève pas d’exception, mais ne se lie pas à la source que l’on pense.
Ouvrez alors votre code XAML et déclarez l’espace de noms suivant :
xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
Vous pouvez lui attribuer le tagkey que vous souhaitez, j’ai choisis diag, mais zjergtziuyaziuefgapiugzpiufgzffiudgf fait aussi l’affaire si cela vous paraît plus clair !
L’étape suivante consiste à repérer le binding que l’on souhaite auditer, dans notre cas :
<ScaleTransform ScaleX="{Binding ElementName=zoomSlider,
Path=Value}"
ScaleY="{Binding ElementName=zoomSlider,
Path=Value}" />
</TabControl.LayoutTransform>
On effectue la modification suivante :
|
<ScaleTransform ScaleX="{Binding ElementName=zoomSlider, Path=Value, diag:PresentationTraceSources.TraceLevel=High}" ScaleY="{Binding ElementName=zoomSlider, Path=Value}"/> </TabControl.LayoutTransform> |
On relance et consulte à nouveau la console de sortie. On retrouve évidemment les deux messages précédents, mais avant :
|
System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: <null> (OK) System.Windows.Data Warning: 70 : Lookup name zoomSlider: queried DockPanel (hash=64981649) System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: <null> (OK) System.Windows.Data Warning: 70 : Lookup name zoomSlider: queried DockPanel (hash=64981649) System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source (last chance) System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: <null> (OK) System.Windows.Data Warning: 70 : Lookup name zoomSlider: queried DockPanel (hash=64981649) |
Le log me dit que WPF va chercher le DataContext dans un DocPanel. Or mon binding ne se trouve pas dans un DockPanel ?
Que se passe-t-il ?
Je fais une recherche dans les différents XAML et découvre un ScaleTransform oublié dans un UserControl. A l'origine c'est lui qui contenait le Slider, mais j'ai déplacé celui-ci et oublié le ScaleTransform.
Une fois celui-ci supprimé, tout est rentré dans l'ordre !
Moralité : utilisez des ressources plutôt qu'une déclaration directe dans les templates !!!!
Dans un de ses blogs, Thomas Lebrun propose un script de validation des bindings :
http://blogs.developpeur.org/tom/archive/2008/11/06/wpf-valider-les-binding-wpf.aspx
Honnêtement je ne suis pas arrivé à comprendre ce qu'il valide au juste ! Si quelqu'un a une idée ?
AJOUT: je viens de trouver ce blog de Bea Stollnitz qui aborde la même question, mais avec des méthodes supplémentaires:
http://bea.stollnitz.com/blog/?p=52
Aucun commentaire pour le moment
Laisser un commentaire
| « Lancer une application WPF si l'on a plusieurs écrans | les chaînes de connexion » |