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

后端 未结 6 1746
面向向阳花
面向向阳花 2021-02-13 09:44

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

相关标签:
6条回答
  • 2021-02-13 10:18

    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*">
                                <DataGridTextColumn.CellStyle>
                                    <Style>
                                        <Setter Property="ToolTipService.ToolTip" Value="{Binding DisplayText, Mode=OneWay}"/>
                                    </Style>
                                </DataGridTextColumn.CellStyle>
                            </DataGridTextColumn>
    
    0 讨论(0)
  • 2021-02-13 10:20

    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}">
                    </Setter>                 
                </Style>
    
            </dg:DataGrid.RowStyle>
    

    And the resource is

    <Window.Resources>
        <StackPanel x:Key="resKWIC">
            <TextBlock>f1</TextBlock>
            <TextBlock>f2></TextBlock>
        </StackPanel>
    </Window.Resources>
    

    Thanks!

    0 讨论(0)
  • 2021-02-13 10:24

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

    <Setter Property="ToolTip">
        <Setter.Value>
            <StackPanel>
                <TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock>
            </StackPanel>
        </Setter.Value>
    </Setter>
    
    0 讨论(0)
  • 2021-02-13 10:25

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

    <Setter Property="ToolTipService.ToolTip" Value="My Tooltip"/>
    
    0 讨论(0)
  • 2021-02-13 10:26

    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">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}" Width="*" />
            <DataGridTextColumn Binding="{Binding Text}" Width="0" Visibility="Hidden" />
        </DataGrid.Columns>
        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.text}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>
    
    0 讨论(0)
  • 2021-02-13 10:33

    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" 
                 LoadingRow="dgResults_LoadingRow" 
                 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 =)

    0 讨论(0)
提交回复
热议问题