0

Validation.HasError のすべての TextBox に適用される Trigger を作成して、Validation.Error をカスタム ToolTip に表示したいと考えています。

<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 > などからトラバースするためだと思います。

代わりにスタイル ターゲットを参照するにはどうすればよいですか?

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 に答える