Search code examples
wpfdatagridtooltip

Templated tooltip for DataGridCell depending on cell's content


I want to display tooltip of different view depending on content of DataGridCell. The following code works.

<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn Header="1" Binding="{Binding}">
            <DataGridTextColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="ToolTip">
                        <Setter.Value>
                            <ToolTip>
                                <ToolTip.Content>
                                    <TextBlock Foreground="Blue" Text="{Binding}"></TextBlock>
                                </ToolTip.Content>
                            </ToolTip>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGridTextColumn.CellStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
    <DataGrid.Items>
        <system:String>AAA</system:String>
        <system:Int32>2</system:Int32>
    </DataGrid.Items>
</DataGrid>

But when I try using templates I have no success (I want select template basing on type of view model).

<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn Header="1" Binding="{Binding}">
            <DataGridTextColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="ToolTip">
                        <Setter.Value>
                            <ToolTip>
                                <ToolTip.ContentTemplate>
                                    <DataTemplate>
                                        <ContentControl Content="{Binding}">
                                            <ContentControl.Resources>
                                                <DataTemplate DataType="system:String">
                                                    <TextBlock Foreground="Blue" Text="{Binding}"></TextBlock>
                                                </DataTemplate>
                                                <DataTemplate DataType="system:Int32">
                                                    <TextBlock Foreground="Red" Text="{Binding}"></TextBlock>
                                                </DataTemplate>
                                            </ContentControl.Resources>
                                        </ContentControl>
                                    </DataTemplate>
                                </ToolTip.ContentTemplate>
                            </ToolTip>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGridTextColumn.CellStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
    <DataGrid.Items>
        <system:String>AAA</system:String>
        <system:Int32>2</system:Int32>
    </DataGrid.Items>
</DataGrid>

How to fix it?


Solution

  • Bind the Content property of the Tooltip itself to the DataContext and use explicit type specifications using {x:Type}:

    <DataGrid>
        <DataGrid.Columns>
            <DataGridTextColumn Header="1" Binding="{Binding}">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="{x:Type DataGridCell}">
                        <Setter Property="ToolTip">
                            <Setter.Value>
                                <ToolTip Content="{Binding}">
                                    <ToolTip.ContentTemplate>
                                        <DataTemplate>
                                            <ContentControl Content="{Binding}">
                                                <ContentControl.Resources>
                                                    <DataTemplate DataType="{x:Type system:String}">
                                                        <TextBlock Foreground="Blue" Text="{Binding}"></TextBlock>
                                                    </DataTemplate>
                                                    <DataTemplate DataType="{x:Type system:Int32}">
                                                        <TextBlock Foreground="Red" Text="{Binding}"></TextBlock>
                                                    </DataTemplate>
                                                </ContentControl.Resources>
                                            </ContentControl>
                                        </DataTemplate>
                                    </ToolTip.ContentTemplate>
                                </ToolTip>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
        </DataGrid.Columns>
        <DataGrid.Items>
            <system:String>AAA</system:String>
            <system:Int32>2</system:Int32>
        </DataGrid.Items>
    </DataGrid>