2013-04-23 64 views
1

我试图绑定ListBoxItem的工具提示。我有这样的定义在我的控件模板:工具提示中的WPF DataContext

<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 : Cannot find element that provides DataContext. BindingExpression:Path=Images; DataItem=null; target element is 'DockPanel' (Name=''); target property is 'DataContext' (type 'Object')

我ListBoxItem中的datacontext的不包含图像属性作为它的名称和图标的属性,这是正确显示。我也尝试使用TooltipService.ToolTip而不是Border.ToolTip,没有任何效果。有什么区别,为什么我的绑定工作?

+1

请参阅[本文的答案](http://stackoverflow.com/a/14755540/302677)(现在没有时间将其写成完整答案:)) – Rachel 2013-04-23 14:01:08

+0

谢谢Rachel,这个led我到解决方案。 – Echilon 2013-04-23 14:06:35

回答

3

最终解决了这个改变工具提示这样的:

... 
<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领导我的答案。