如何使ListViewItem ToolTip优先于TextBlock ToolTip?

时间:2015-10-21 18:17:29

标签: c# wpf tooltip textblock listviewitem

给出如下对象:

public class Item
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public int Hidden { get; set; }
}

只显示为:

<Grid>
    <Grid.Resources>
        <!-- style stuff -->
    </Grid.Resources>
    <ListView 
        x:Name="ItemsListView"
        ItemsSource="{Binding AllItems}"
        SelectedValue="{Binding SelectedItem}">
        <ListView.View>
            <GridView>
                <GridViewColumn 
                    Width="75"
                    DisplayMemberBinding="{Binding Foo, Mode=OneWay}"
                    Header="Foo"/>
                <GridViewColumn 
                    Width="75"
                    DisplayMemberBinding="{Binding Bar, Mode=OneWay}"
                    Header="Bar"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

Grid.Resources我创建了以下样式,以允许ToolTip在悬停时显示每个单元格值:

<Style TargetType="{x:Type TextBlock}">
    <Setter 
        Property="ToolTip"
        Value="{Binding RelativeSource={RelativeSource Self},  Path=Text}"/>
    <Setter
        Property="TextTrimming"
        Value="CharacterEllipsis"/>
</Style>

按预期工作。但现在我想根据Hidden属性验证一行。如果值为-1,请将该行标记为红色并显示TooTip消息:

<Style TargetType="{x:Type ListViewItem}">
    <Style.Triggers>
        <DataTrigger
            Binding="{Binding Hidden}"
            Value="-1">
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="ToolTip" Value="Bad Item... Bad!"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

只要我将鼠标悬停在无效项目的单元格边框上,也可以。当我将鼠标悬停在无效项目的FooBar单元格上时,会显示显示单元格值的上一个ToolTip

gif of current working code

如果行无效,如何让ListViewItem.ToolTip覆盖TextBlock.ToolTip

1 个答案:

答案 0 :(得分:1)

您可以按如下方式设置TextBlock样式,以便在DataTrigger中为指定的条件设置ToolTip。在这种情况下,如果未在GridViewColumn上设置ToolTip,则会自动显示ListViewItem工具提示。

<Style TargetType="{x:Type TextBlock}">
    <Setter
        Property="TextTrimming"
        Value="CharacterEllipsis"/>
    <Setter Property="HorizontalAlignment" Value="Stretch" />
    <Style.Triggers>
        <DataTrigger
            Binding="{Binding Hidden}"
            Value="0">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},  Path=Text}"/>
        </DataTrigger>
    </Style.Triggers>
 </Style>