7

この質問から分岐する-

このようにカスタムテキストボックスに検証エラーテンプレートを添付すると-

<local:CustomTextBox CustomText="{Binding ViewModelProperty}" Validation.ErrorTemplate="{StaticResource errorTemplate}"/>

<ControlTemplate x:Key="errorTemplate">
    <DockPanel>
        <Border BorderBrush="Red" BorderThickness="1">
            <AdornedElementPlaceholder x:Name="controlWithError"/>
        </Border>
        <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0"  MouseDown="Exclamation_MouseDown"  Tag="{Binding AdornedElement.(Validation.Errors)[0].ErrorContent, ElementName=controlWithError}">!</TextBlock>
    </DockPanel>
</ControlTemplate>

ViewModelProperty で検証エラーが発生した場合、私のアプリケーションは例外をスローしていました -

Key cannot be null.
Parameter name: key

なぜこれが起こっているのかわかりません。新しいエラー テンプレートをカスタム コントロールに割り当てるために必要なことはありますか?

アップデート:

エラー テンプレートの Tag プロパティに問題があることがわかりました。タグを削除すると、問題なく動作します。

ありがとう

4

1 に答える 1

9

問題を解決する方法は、AdornedElement キーワードを削除し、エラー テンプレートを次のように変更することでした。

<local:CustomTextBox CustomText="{Binding ViewModelProperty}">
    <Validation.ErrorTemplate>
        <ControlTemplate>
            <DockPanel>
                <Border BorderBrush="Red" BorderThickness="1">
                    <AdornedElementPlaceholder x:Name="controlWithError"/>
                </Border>
                <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0"  MouseDown="Exclamation_MouseDown">!</TextBlock>
            </DockPanel>
        </ControlTemplate>
    </Validation.ErrorTemplate>
    <local:CustomTextBox.Style>
        <Style TargetType="{x:Type local:CustomTextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                    <Setter Property="Tag" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </local:CustomTextBox.Style>
</local:CustomTextBox>

私が理解していないのは、AdornedElement キーワードを使用すると動作が異なるのに、RelativeSource を使用してタグ/ツールチップをバインドすると正常に動作する理由です。問題は解決しましたが、なぜこれが起こったのかについてのアイデアを歓迎します.

ありがとう

于 2013-02-01T15:44:28.780 に答える