WPF中的ToolTip数据上下文

4

我正在尝试绑定ListBoxItem的工具提示。 我在ControlTemplate中定义了这个:

<ControlTemplate TargetType="{x:Type ListBoxItem}">
    <ControlTemplate.Resources>
        <conv:IconConverter x:Key="IconConverter" />
        <conv:FirstImageConverter x:Key="FirstImageConverter"/>
        <conv:DebugConverter x:Key="dbg"/>
    </ControlTemplate.Resources>
<Border ...>
    <StackPanel>
        <Image MaxHeight="160" Stretch="UniformToFill" Source="{Binding Icon,Converter={StaticResource IconConverter},ConverterParameter=128}" Height="128"/>
        <TextBlock x:Name="lblName" Text="{Binding Name}" />
    </StackPanel>
    <Border.ToolTip>
        <DockPanel LastChildFill="True" Margin="2" MaxWidth="800" 
        DataContext="{Binding Images,Converter={StaticResource FirstImageConverter}}" 
        IsEnabled="{Binding Images,Converter={StaticResource FirstImageConverter},ConverterParameter=enabled}">
            <TextBlock DockPanel.Dock="Bottom" Width="Auto" MaxWidth="600"  Text="{Binding Caption}" Height="Auto" />
            <Image x:Name="imgFullSize" DockPanel.Dock="Top" Stretch="None" Width="Auto" Source="{Binding Filename,Converter={StaticResource IconConverter}}"/>
        </DockPanel>
    </Border.ToolTip>

我遇到了一个绑定错误:System.Windows.Data Error: 3 : 找不到提供 DataContext 的元素。BindingExpression:Path=Images; DataItem=null; target element is 'DockPanel' (Name=''); target property is 'DataContext' (type 'Object')

我的 ListBoxItem 的 DataContext 包含了 images 属性,同时也包含了 name 和 icon 属性,这两个属性都能正确地显示出来。我还尝试过使用 TooltipService.ToolTip 代替 Border.ToolTip,但没有任何效果。这两者有什么区别,为什么我的绑定不起作用呢?


1
请参考我的这个回答(现在没时间写成完整的答案 :))。 - Rachel
谢谢Rachel,这让我找到了解决方案。 - Echilon
1个回答

10

最终通过将工具提示更改为以下内容解决了这个问题:

...
<Border.ToolTip>
    <ToolTip DataContext="{Binding PlacementTarget.DataContext.Images, RelativeSource={RelativeSource Self}}" Visibility="{Binding PlacementTarget.DataContext.Images, RelativeSource={RelativeSource Self},Converter={StaticResource FirstImageConverter},ConverterParameter=visible}">
        <DockPanel LastChildFill="True" Margin="2" MaxWidth="800">
            ...

感谢 @Rachel 帮我找到答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接