TAGS :Viewed: 10 - Published at: a few seconds ago

[ How to specify a ToolTip for a control in a Style from XAML? ]

I'm using a the WPF datagrid from the Microsoft CodePlex project. I have a custom control that I want to databind to a field from the row of the datagrid. I can't for the life of me figure out how to specify a tooltip on a datagrid row.

The closest I've come is to use a RowStyle with a Setter to set the tooltip, but this only seems to work for text. When I try to put a ControlTempalte in as the Value for the ToolTip, it displays the result of calling ToString on the ControlTemplate type.

I think I need to set the "Template" property of the ToolTip, but I can't seem to figure out how to do that...

  <dg:DataGrid Name="dgResults" AutoGenerateColumns="True">

            <dg:DataGrid.RowStyle >

            <Style TargetType="{x:Type dg:DataGridRow}">

                <Setter Property="ToolTip"  >

                        <ControlTemplate TargetType="{x:Type ToolTip}">




Answer 1

Figured it out... took me about 6 hours...

For some reason, I can't set the value directly using Value.Setter. If I define the content for the tooltip as a static resource though, and then set it in the Style property of the DataGrid.RowStyle it works.

So, the datagrid row style looks like:

            <Style TargetType="{x:Type dg:DataGridRow}">

                <Setter Property="ToolTip" Value="{StaticResource resKWIC}">


And the resource is

    <StackPanel x:Key="resKWIC">


Answer 2

The key is to use the Property ToolTipService.ToolTip, instead of ToolTip - like this:

<Setter Property="ToolTipService.ToolTip" Value="My Tooltip"/>

Answer 3

I also got this working with a couple of changes; included incase it helps someone.

My Datadrid is bound to a list of custom objects, I wanted to display the string "Name" as a column and the string "text" in the tooltip. The trick for me (newbe) was that I had to include the Text Column and hide it for it to show up in the tooltip, i.e.:

<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" EnableRowVirtualization="False" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" Name="dgrTextGroupText" VerticalContentAlignment="Stretch" Grid.Column="3" Grid.Row="1" Grid.RowSpan="6" CanUserReorderColumns="False" CanUserSortColumns="False">
        <DataGridTextColumn Binding="{Binding Name}" Width="*" />
        <DataGridTextColumn Binding="{Binding Text}" Width="0" Visibility="Hidden" />
        <Style TargetType="{x:Type DataGridRow}">
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.text}" />

Answer 4

There's no need for the ControlTemplate. If you want the StackPanel in the ToolTip, just set it as:

<Setter Property="ToolTip">

Answer 5

Not sure you can do it through XAML.

A easier way might be to just handle the LoadingRow event. In xaml have something like:

<dg:DataGrid Name="dgResults" AutoGenerateColumns="True" 
             ItemsSource="{Binding ListOfStrings}" />

Then in code behind

void dgResults_LoadingRow(object sender, DataGridRowEventArgs e)
    DataGridRow row = e.Row;
    row.ToolTip = row.DataContext as string;

Obviously you will have to change the code depending on how you are populating the data in the datagrid. This is also untested =)

Answer 6

I needed to set the tooltip dynamically based on the cell content. I'm using the tooltip to display text overflow text from the cell. The binding below is from a c# class property named CellText. Thanks to the posts above for allowing me to avoid figuring out the entire thing myself.

<DataGridTextColumn Header="HeaderText" Binding="{Binding DisplayText, Mode=OneWay}" Width="33*">
                                    <Setter Property="ToolTipService.ToolTip" Value="{Binding DisplayText, Mode=OneWay}"/>