文本框验证未显示错误

本文关键字:显示 错误 验证 文本 | 更新日期: 2023-09-27 18:35:57

我已经构建了一个用于在 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上。

文本框验证未显示错误

您很接近,绑定的Setter Value语法不正确,而且您应该Path设置为Validation.Errors

 <Setter Property="ToolTip"
         Value="{Binding Converter={StaticResource ErrorConverter},
                         RelativeSource={x:Static RelativeSource.Self},
                         Path=(Validation.Errors)}"/>

我找到了问题的答案。

事实证明,我的对话框包含一个TabControl,这就是问题的原因。 我在本文中找到了答案。 实质上,我需要将包含要验证的控件的TabItem的内容放在 AdornerDecorator 控件中,该控件本身位于 Border 控件内。 完成此操作后,错误指示器将全部正确显示。

起初我没有包括我的控件在TabControl内的事实,因为我不知道这很重要。 生活和学习。