Ellipsis, bindings, tooltips, et popups
Les tooltips (parfois appelés « infobulles ») font partie intégrante de toute interface utilisateur moderne. Je ne peux que vous encourager à les utiliser car ils permettent de fournir à l'utilisateur un complément d'information sans pour autant occuper un espace fixe. Dans le projet attaché, j'ai par exemple appliqué un ToolTip a un TextBlock dont le contenu est tronqué via la propriété TextTrimming.
Bien que le contenu de ces tooltips soit la plupart du temps statique, il arrive que les données que l'on souhaite y afficher soient dynamiques. Plus précisément, on souhaite appliquer un binding pour pouvoir lier le contenu du ToolTip au DataContext en cours. Il y a cependant un hic : bien que le ToolTip soit déclaré au sein de d'un FrameworkElement, ce dernier n'est cependant pas son parent.
Comment alors passer des données pour profiter des bindings WPF? Réponse : en utilisant la propriété ToolTip.PlacementTarget. Cette propriété faisant automatiquement référence à l'élément appelant, il devient possible d'effectuer le binding voulu. A titre personnel, et lorsque l'appelant est un FrameworkElement, j'utilise la propriété Tag pour référencer le contexte que je souhaite passer au DataContext de mon ToolTip :
<TextBlock Text="{Binding ElementName=tbxNom,Path=Text}" Background="AliceBlue"
Tag="{Binding ElementName=tbxNom}" TextTrimming="CharacterEllipsis">
<TextBlock.ToolTip>
<ToolTip DataContext="{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Tag}">
<TextBlock Text="{Binding Text}"/>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
Le lien étant ainsi fait, le binding dans le contenu du ToolTip peut maintenant fonctionner :
Note : Cette technique ne permet que les bindings par DataContext, les bindings par ElementName n'étant pas applicables car, contrairement aux popups, les ToolTips ne sont pas créés dans l'arbre d'élément de la racine (fenêtre ou page). Ce qui explique par ailleurs l'existence de la propriété PlacementTarget !