1

WPF アプリケーションでデータを編集するためのフォームを作成しました。フォームにバリデーションを追加中です。この記事この記事を使用して開始しましたが、エラー テンプレートが常に表示されるか、まったく表示されません。何が間違っているのかわかりません。

これが私が使用しているControlTemplateStyleです。それらはフォームのリソースにあります:

<ControlTemplate x:Key="TextBoxErrorTemplate">
    <StackPanel ClipToBounds="False" Orientation="Horizontal">
        <Border BorderBrush="Red"
                BorderThickness="1"
                Margin="15,0,0,0">
            <AdornedElementPlaceholder Name="adornedElement" />
        </Border>
        <Image HorizontalAlignment="Right"
               VerticalAlignment="Top"
               Width="20"
               Height="20"
               Margin="0,-5,-5,0"
               Source="{StaticResource ErrorImage}"
               ToolTip="{Binding Converter={StaticResource ErrorConverter}, 
                                 ElementName=adornedElement, 
                                 Path=AdornedElement.(Validation.Errors)}" />
    </StackPanel>
</ControlTemplate>

<Style x:Key="TextBoxErrorStyle" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"
                    Value="Binding Converter={StaticResource ErrorConverter}, 
                                   RelativeSource={x:Static RelativeSource.Self}, 
                                   Path=AdornedElement.(Validation.Errors)}"/>
        </Trigger>
    </Style.Triggers>
</Style>

そして、TextBoxこれらのパーツを使用する は次のとおりです。

<TextBox Grid.Column="0"
            Margin="5,0"
            MaxLength="50"
            Name="NameBox"
            TabIndex="0"
            Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}"
            Style="{StaticResource TextBoxErrorStyle}"
            TextAlignment="Left"
            TextChanged="NameBox_TextChanged"
            VerticalAlignment="Center"
            Visibility="{Binding Converter={StaticResource InvertedBoolToVisibility}, Path=AutoConfigureCameras, RelativeSource={RelativeSource AncestorType={x:Type cs:EditLPRDetails}}}">
    <TextBox.Text>
        <Binding Mode="TwoWay" Path="Name" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <cs:RegexValidationRule Pattern="{StaticResource NamePattern}" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

RegexValidationRuleクラスの検証ロジックが機能することに注意してください。に有効な文字列を入れるTextBoxと成功を返し、無効な文字列を入れると失敗を返します。何が間違っているにせよ、問題は にあると思いますStyle's Trigger

4

2 に答える 2

2

You are close, the Setter Value syntax for binding is not correct, plus you should set Path as Validation.Errors

 <Setter Property="ToolTip"
         Value="{Binding Converter={StaticResource ErrorConverter},
                         RelativeSource={x:Static RelativeSource.Self},
                         Path=(Validation.Errors)}"/>
于 2013-10-19T05:17:50.677 に答える
0

私は自分の問題に対する答えを見つけました。

ダイアログ ボックスに が含まれてTabControlおり、それが問題の原因であることがわかりました。この記事で答えを見つけました。基本的に、TabItem検証されるコントロールを含むの内容を、AdornerDecoratorそれ自体がコントロールの内部にあるコントロールの内部に配置する必要がありBorderます。これが完了すると、エラー インジケータがすべて正しく表示されます。

最初はコントロールが の中にあるという事実を含めませんでしたTabControl。それが重要であることを知らなかったからです。生活し、学びます。

于 2013-10-21T21:28:50.610 に答える