I have a user control that shows a TextBox
along with a small help icon.
My goal is to have a ToolTip
pop-up, show some databound text and
ToolTips are not part of the same VisualTree as the rest of your XAML, so the DataContext
is not inherited the way you would expect it to be.
Writing ToolTip="{Binding SomeProperty}"
will automatically set the ToolTip's DataContext
to SomeProperty
, however if you build a custom ToolTip you must do this yourself.
<ToolTip DataContext="{Binding PlacementTarget.DataContext,
RelativeSource={RelativeSource Self}}" ... />
This will bind the ToolTip's DataContext
to the DataContext
of whatever object the ToolTip is on.
To accomplish what you're trying to do, your <ToolTip>
would probably look like this, since PlacementTarget
would be your Image
:
<!-- Could also use something like Tag if DataContext is actually used -->
<Image DataContext="{Binding ElementName=textField, Path=HelpText}"
Source="{StaticResource Help.Icon}">
<Image.ToolTip>
<ToolTip Content="{Binding PlacementTarget.DataContext,
RelativeSource={RelativeSource Self}}"/>
</Image.ToolTip>
</Image>
As for why it won't stay open, I'm not positive but it might be because the ToolTipService.ShowDuration property defaults to 5 seconds, and that probably overwrites the StaysOpen
property.
You can try setting it to something higher, such as
<Image ToolTipService.ShowDuration="60000" ... />
Or you can try this workaround of using a Popup
styled to look like a ToolTip
instead. The code would probably look something like this:
<Popup PlacementTarget="{Binding ElementName=MyImage}"
IsOpen="{Binding IsMouseOver, ElementName=MyImage, Mode=OneWay}">
<TextBlock Text="{Binding ElementName=textField, Path=HelpText}" />
</Popup>