我想创建一个触发器,应用于Validation.HasError上的所有TextBox,以在自定义工具提示中显示Validation.Error。
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip">
<Setter.Value>
<StackPanel>
<TextBlock Text="{Binding RelativeSource={RelativeSource XXX}, Path=(Validation.Error)[0].ErrorContent}"/>
</StackPanel>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
我应该在XXX中添加什么内容?
我的问题是我真的不明白RelativeSource如何在这个上下文中工作,我无法获得绑定到TextBox的正确代码。
我猜Self会引用TextBlock和FindAncestor x:Type TextBox会失败,因为它将从TextBlock&gt;遍历StackPanel&gt; Setter.Value&gt; Setter&gt;等等。而不是。
如何更改引用样式目标?
答案 0 :(得分:2)
由于ToolTip
不是可视化树的一部分,因此获得所需的行为有点麻烦。
您可以使用其PlacementTarget属性来查找它所附加的元素,并将其DataContext
设置为该元素。在你的情况下,这将是TextBox
。
现在您可以直接绑定到Validation.Errors
属性,它会在给定的TextBox
上找到验证错误。
您可以使用以下代码使其正常工作:
<Window.Resources>
<ToolTip x:Key="errorTooltip"
DataContext="{Binding PlacementTarget,
RelativeSource={RelativeSource Self}}">
<StackPanel>
<TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent}" />
</StackPanel>
</ToolTip>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip" Value="{StaticResource errorTooltip}" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>