文本框未在WPF中显示红色验证错误

时间:2016-01-18 19:13:15

标签: c# wpf validation

我们目前正在使用WPF和.Net4.5编写GUI应用程序。

我们的某个网页包含TabControl,其自定义UserControlTabItem。这些UserControl只包含一个可编辑的TextBox es列表。 Textbox es有一个自定义ValidationRule,可根据正则表达式验证文本。问题是这些可编辑的文本框绑定到Properties,它在启动时使用文本文件/数据库中的默认值加载。

我需要在文本框具有焦点之前或编辑之前进行验证,以确保正确输入在文本文件/数据库中输入的值。目前,当我选择一个标签项时,文本框不会显示红色验证错误框,即使验证运行正常。只有在我点击Validation错误的项目后才能看到相关的红色框。

我正在使用UpdateSourceTrigger="PropertyChanged"我可以调试并看到验证码在正确的时间运行,但仍然不会显示红色框。每当TabItem获得焦点时,我甚至添加了代码来重新触发绑定属性上的'Property changed'事件 - 但这仍然无济于事。以下是未显示验证的TextBox之一的示例:

<TextBox x:Name="TextBox1" Margin="10,5,5,5" Width="150" MaxLength="5" Style="{StaticResource ServiceEntryTextBox}">
    <TextBox.Text>
        <Binding Path="TexBox1BoundProperty" Converter="{StaticResource DoubleConverter}" UpdateSourceTrigger="PropertyChanged"  ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
            <Binding.ValidationRules>
                <validation:StringRegexFormatValidation RegexPattern="^[0-9]{0,1}.{0,1}[0-9]{1,3}$" ValidatesOnTargetUpdated="True"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

我还缺少另一件吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试将TextBox放入AdornerDecorator吗?我需要挖掘出源代码,但我之前看到的问题是Tab控件内的控件无法正确呈现验证。

e.g。

<AdornerDecorator>
    <TextBox x:Name="TextBox1" Margin="10,5,5,5" Width="150" MaxLength="5" Style="{StaticResource ServiceEntryTextBox}">
        <TextBox.Text>
            <Binding Path="TexBox1BoundProperty" Converter="{StaticResource DoubleConverter}" UpdateSourceTrigger="PropertyChanged"  ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
                <Binding.ValidationRules>
                    <validation:StringRegexFormatValidation RegexPattern="^[0-9]{0,1}.{0,1}[0-9]{1,3}$" ValidatesOnTargetUpdated="True"/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
</AdornerDecorator>

进一步帮助调试

我直接绑定到DependencyProperty时也遇到了问题。我看到的问题是我提出INotifyPropertyChanged以触发要处理的验证(在.NET 4.0中工作正常)但是自.NET 4.5起,您无法使用INotifyPropertyChanged来触发{ {1}}。