文本框验证未显示错误
本文关键字:显示 错误 验证 文本 | 更新日期: 2023-09-27 18:35:57
我已经构建了一个用于在 WPF 应用程序中编辑数据的表单。 我正在向表单添加验证。 我首先使用这篇文章和这篇文章,但错误模板要么显示所有时间,要么根本不显示。 我不知道我做错了什么。
以下是我正在使用的ControlTemplate
和Style
。 它们位于表单的资源中:
<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
内的事实,因为我不知道这很重要。 生活和学习。