IX. Déboguer efficacement le Binding▲
IX-A. Le Binding au design-time▲
Il peut être très intéressant lorsque l'on utilise le designer de Visual Studio ou Expression Blend, d'avoir le retour visuel immédiat. Ainsi, on voit directement des données peupler les contrôles, cela permet d'avoir une première impression sur le rendu (et d'éventuellement détecter certaines erreurs). Pour cela, il faut faire plusieurs choses : importer les namespaces d et mc ci-après, déclarer un d:DataContext qui sera le DataContext au design-time et enfin avoir un objet « Blendable ». Voici un exemple :
<Window
x
:
Class
=
"BindingTutorial.WpfApplication.MainWindow"
xmlns
=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns
:
x
=
"http://schemas.microsoft.com/winfx/2006/xaml"
xmlns
:
d
=
"http://schemas.microsoft.com/expression/blend/2008"
xmlns
:
mc
=
"http://schemas.openxmlformats.org/markup-compatibility/2006"
mc
:
Ignorable
=
"d"
xmlns
:
WpfApplication
=
"clr-namespace:BindingTutorial.WpfApplication"
d
:
DataContext
=
"{d:DesignInstance Type=WpfApplication:MyObject, IsDesignTimeCreatable=True}"
>
</Window>
On voit les deux namespaces importés et l'utilisation du DataContext par la construction d'une instance de MyObject. Il est à noter l'instruction mc:Ignorable=« d » qui indique que tout ce qui est dans le namespace d doit être ignoré à la compilation, sans elle plusieurs erreurs auraient été levées. Le dernier point est d'avoir un objet « Blendable » : lorsque Visual Studio effectue le rendu, il essaie réellement de créer une instance de l'objet en exécutant le constructeur. Par conséquent, on peut donner des valeurs aux propriétés, générer toute une arborescence, etc. Certaines opérations sont cependant interdites comme, par exemple, des appels à des Webservices. Un objet « Blendable » est donc un objet qui pourra être affiché dans le designer de Visual Studio (ou Expression Blend), car il n'exécute aucune opération interdite.
IX-B. Les erreurs de Binding▲
Bien souvent, lorsqu'un binding ne fonctionne pas, une erreur apparait dans la console lors de l'exécution en Debug. Cette erreur est assez souvent explicite pour vite comprendre le problème. Voici un exemple :
System.Windows.Data Error: 40 : BindingExpression path error: 'MyProperty' property not found on 'object' ''MyObject' (HashCode=28918197)'. BindingExpression:Path=MyProperty; DataItem='MyObject' (HashCode=28918197); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')
Ici, il semblerait que j'ai tenté de binder la propriété Text (de type String) d'une TextBox sans nom à la propriété MyProperty sur une instance de MyObject.
Il est possible de configurer la verbosité des traces de Binding pour WPF. Pour cela, il suffit d'aller dans les options de Visual Studio, rubrique Debugging > Output Window > WPF Trace Settings > Data Binding . Le niveau par défaut est Warning.
IX-C. Espionner le Binding▲
Bien souvent, il est utile de vouloir intercepter le Binding lors de l'exécution et pouvoir naviguer. Une astuce consiste à créer un Converter « passe-plat » dans lequel on peut poser des points d'arrêt dans le Convert et le ConvertBack. Ainsi, il est possible d'inspecter ce qui transite. Un tel Converter ressemble à ceci :
public
class
DebugConverter :
IValueConverter
{
public
object
Convert
(
object
value
,
Type targetType,
object
parameter,
CultureInfo culture)
{
return
value
;
}
public
object
ConvertBack
(
object
value
,
Type targetType,
object
parameter,
CultureInfo culture)
{
return
value
;
}
}
Dorénavant, avec Silverlight 5, un bien meilleur outil s'offre à nous ! En effet, il est possible de poser des points d'arrêt dans le XAML et ainsi déboguer le Converter. Il est donc beaucoup plus simple de comprendre ce qui pose problème.