TextBox验证不显示错误

时间:2013-10-19 04:51:46

标签: c# wpf validation

我在WPF应用程序中构建了一个用于编辑数据的表单。我正在为表单添加验证。我开始使用this articlethis one,但错误模板要么全部显示,要么根本不显示。我不知道我做错了什么。

以下是我正在使用的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

2 个答案:

答案 0 :(得分:2)

您已结束,绑定的Setter Value语法不正确,另外您应将Path设为Validation.Errors

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

答案 1 :(得分:0)

我找到了问题的答案。

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

我最初没有包含我的控件在{{1}}内的事实,因为我不知道它很重要。生活和学习。