使用Setter.Value中的RelativeSource绑定到样式目标

时间:2013-04-28 16:49:42

标签: wpf binding relativesource

我想创建一个触发器,应用于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;等等。而不是。

如何更改引用样式目标?

1 个答案:

答案 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>