不确定这里做了什么,但绑定适用于数据模板中的标签但不适用于工具提示。任何帮助将不胜感激。
<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>
干杯
麦克
答案 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>