DataGridRow 的默认样式如下:
<Style x:Key="{x:Type DataGridRow}" TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="{DynamicResource {x:Static
SystemColors.WindowBrushKey}}" />
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
<Setter Property="ValidationErrorTemplate">
<Setter.Value>
<ControlTemplate>
<TextBlock Margin="2,0,0,0" VerticalAlignment="Center"
Foreground="Red" Text="!" />
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
...
</Setter>
</Style>
我想要的是将 ToolTip 添加到显示“!”的 TextBlock 在行标题中,它将从 DataGridRow.Item.Error 属性中获取错误消息(我的实体对象实现了 IDataErrorInfo)。所以我做了以下事情:
<TextBlock Margin="2,0,0,0" VerticalAlignment="Center"
Foreground="Red" Text="!"
ToolTip="{Binding RelativeSource={
RelativeSource FindAncestor,
AncestorType={x:Type DataGridRow}},
Path=Item.Error}"/>
到现在为止还挺好。现在,Error 属性返回多行字符串,所以我想将 TextBlock 用于 ToolTip:
<TextBlock Margin="2,0,0,0" VerticalAlignment="Center"
Foreground="Red" Text="!">
<TextBlock.ToolTip >
<TextBlock Text="{Binding RelativeSource={
RelativeSource FindAncestor,
AncestorType={x:Type DataGridRow}},
Path=Item.Error}"
TextWrapping="Wrap"/>
</TextBlock.ToolTip>
</TextBlock>
但以上不会显示错误信息;问题似乎是 ToolTip 不是父元素的可视化树的一部分。我读过 PlacementTarget 等,但仍然无法完成工作。有人可以告诉我执行上述操作的正确方法吗?