如何在自定义文本块样式属性设置器中绑定ToolTip内容

时间:2018-01-03 16:02:08

标签: c# xaml xaml-binding

我正在尝试创建一个文本块,该文本块在剪切时显示文本块文本的工具提示。我有一个转换器中的实际可见性部分。我的问题是将ToolTip的内容绑定到其partent文本块的文本。我一直在摆弄不同的相对路径一段时间,除了一个空白的工具提示之外永远不会得到任何东西。如果我在工具提示内容中对某些内容进行硬编码,那么当我想要的时候,文本显示正常。

<Style x:Key="InfoToolTipBaseTextBlockStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockBase}">
    <Setter Property="ToolTip">
        <Setter.Value>
            <ToolTip Visibility="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget, Converter={StaticResource TrimmedVisibilityConverter}}" Content="{Binding Path=Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TextBlock}}}"/>                
        </Setter.Value>
    </Setter>
</Style>

2 个答案:

答案 0 :(得分:2)

不是创建始终存在的工具提示,设置其内容,然后切换其可见性,而是在TextBlock上设置样式触发器,在需要时将ToolTip属性设置为Text。

我已经使用了您现有的转换器,但您可能需要重写它以返回bool。然后,Value="True"中有DataTrigger

<Style 
    x:Key="InfoToolTipBaseTextBlockStyle" 
    TargetType="{x:Type TextBlock}" 
    BasedOn="{StaticResource TextBlockBase}"
    >
    <Style.Triggers>
        <DataTrigger 
            Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource TrimmedVisibilityConverter}}"
            Value="Visible"
            >
            <Setter Property="ToolTip" Value="{Binding Text, RelativeSource={RelativeSource Self}}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

我不知道这对你是否有问题,但如果Text在运行时发生变化,工具提示将不会更新,因为Binding不知道你关心{{1属性。修复此问题的方法是将转换器重写为Text,以便将其与可绑定到IMultiValueConverter以及Text的MultiBinding一起使用。它不必使用 Self,但会在Text更改时更新目标。

更好的解决方案,更简单和WPFish,将为Text编写一个行为,回收转换器的内容,处理文本上的更改通知,并更新附加的TextBlock bool属性TextBlock的。

答案 1 :(得分:2)

简单地解决了这个问题。

        <Style x:Key="InfoToolTipBaseTextBlockStyle" TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockBase}">
            <Setter Property="ToolTip">
                <Setter.Value>
                    <ToolTip Visibility="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget, Converter={StaticResource TrimmedVisibilityConverter}}"
                             Content="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.Text}"/>
                </Setter.Value>
            </Setter>
        </Style>