0

我想创建一个触发器以应用于 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 > StackPanel > Setter.Value > Setter > etc.. 遍历。

我怎样才能引用样式目标?

4

1 回答 1

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>
于 2013-04-28T18:37:49.327 回答