WPF绑定到工具提示

时间:2010-11-03 03:20:24

标签: c# wpf xaml binding

不确定这里做了什么,但绑定适用于数据模板中的标签但不适用于工具提示。任何帮助将不胜感激。

                    <DataTemplate DataType="Label">
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                        <StackPanel.ToolTip>
                            <ToolTip DataContext="{Binding Path=PlacementTarget,
       RelativeSource={x:Static RelativeSource.Self}}">
                                <TextBlock Text="{Binding Path=DataContext.Description}" />
                            </ToolTip>
                        </StackPanel.ToolTip>
                        <Image Source="{StaticResource ApplicationInfoS}" 
                               Margin="0 0 5 0" Stretch="None"
                               HorizontalAlignment="Left" />
                        <Label Style="{StaticResource lblTextContent}" 
                               Padding="5 0 0 0"
                               Content="{Binding Path=DataContext.Description, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"/>
                    </StackPanel>
                </DataTemplate>

BTW DataView是在Listview中使用的。绑定到列表视图的视图模型上存在“Description”属性。

我在VS2010的输出窗口中收到的消息是:

System.Windows.Data错误:39:BindingExpression路径错误:'object'''String'上找不到'Description'属性(HashCode = -466763399)'。 BindingExpression:路径= DataContext.Description; DataItem ='StackPanel'(Name =''); target元素是'TextBlock'(Name =''); target属性是'Text'(类型'String')

更新

我现在已经放弃了。暂时使用以下hack:

将标签添加到StackPanel并将“描述”绑定到它

    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Tag="{Binding Path=DataContext.Description, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}">

将工具提示绑定到标记。是的,但它确实有效。

<StackPanel.ToolTip>
  <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}">
    <TextBlock Text="{Binding Path=Tag}" />
  </ToolTip>
</StackPanel.ToolTip>

干杯

麦克

4 个答案:

答案 0 :(得分:4)

工具提示不需要亲属资源绑定。试试这个没有数据上下文绑定

<StackPanel.ToolTip>
    <ToolTip Content={Binding Description} />
<StackPanel.ToolTip>

这假设此DataTemplate所基于的Label类型具有名为Description的属性。您可能需要绑定到PlacementTarget的少数几个实例之一是在某些情况下使用ContextMenu控件。

答案 1 :(得分:2)

工具提示是一个弹出窗口。有时它需要显示主窗口边界。因此工具提示不能在您的主视觉树中。如果查看其可视化树层次结构,您会发现弹出窗口具有自己的可视树根。这就是为什么工具提示不会自动识别列表项的DataContext的原因。现在的问题是如何将DataContext传播到工具提示的可视化树。你在UPDATE中演示的方式就是这样做的一种方式......

答案 2 :(得分:1)

我也在工具提示中遇到绑定问题,因为工具提示被定义为资源。我通过为ToolTipOpening事件创建事件处理程序解决了这个问题。在处理程序函数中,您可以访问显示的UI元素的DataContext并设置工具提示的DataContext。

这是我的XAML:

<StackPanel ToolTip=" " ToolTipOpening="Item_ToolTipOpening" >

这是我的代码处理程序:

void Item_ToolTipOpening(object sender, ToolTipEventArgs e)
    {
        if (sender as FrameworkElement == null)
            return;
        ToolTip tooltip = (ToolTip) FindResource("MailItemToolTip");
        if ((sender as FrameworkElement).DataContext is LinkItem)
            tooltip.DataContext = ((sender as FrameworkElement).DataContext as LinkItem).ParentItem as MailItem;
        else if ((sender as FrameworkElement).DataContext is AttachmentItem)
            tooltip.DataContext = ((sender as FrameworkElement).DataContext as AttachmentItem).ParentItem as MailItem;
        (sender as FrameworkElement).ToolTip = tooltip;
    }

请注意,必须设置工具提示(至少为某个值),否则不会调用ToolTipOpening事件。

答案 3 :(得分:0)

如果此DataTemplate是您所说的ListView的ItemTemplate,那么您不需要在ToolTip上设置DataContext,也不需要在Label.Content绑定中使用RelativeSource BindingExpression。 应该已经由ListView设置了DataContext。这就是我们使用DataTemplate的原因。

尝试每个的常规绑定:

<DataTemplate>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
        <StackPanel.ToolTip>
            <ToolTip>
                <TextBlock Text="{Binding Path=Description}" />
            </ToolTip>
        </StackPanel.ToolTip>
        <Image Source="{StaticResource ApplicationInfoS}" 
               Margin="0,0,5,0"
               Stretch="None"
               HorizontalAlignment="Left" />
        <Label Style="{StaticResource lblTextContent}" 
               Padding="5,0,0,0"
               Content="{Binding Path=Description}" />
    </StackPanel>
</DataTemplate>