WPF-XAML不会调用自定义验证器
本文关键字:验证 自定义 调用 WPF-XAML | 更新日期: 2023-09-27 18:01:00
我在Page.Resources
属性中有一个ControlTemplate
:
<ControlTemplate x:Key="validationErrorTemplate">
<DockPanel>
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
<Grid Width="12" Height="12">
<Ellipse Width="12" Height="12"
Fill="Red" HorizontalAlignment="Center"
VerticalAlignment="Center"/>
<TextBlock Foreground="White" FontWeight="Bold"
FontSize="8" HorizontalAlignment="Center"
VerticalAlignment="Center" TextAlignment="Center"
ToolTip="{Binding ElementName=ErrorAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">X</TextBlock>
</Grid>
<TextBlock Foreground="Red" FontWeight="12" Margin="2,0,0,0"
Text="{Binding ElementName=ErrorAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
</StackPanel>
<AdornedElementPlaceholder x:Name="ErrorAdorner"/>
</DockPanel>
</ControlTemplate>
我用于一个TextBox
控件的模板:
<TextBox Name="txtUserName"
Grid.Row="2" Grid.Column="2"
Margin="0,5,0,5"
VerticalContentAlignment="Center"
Validation.ErrorTemplate="{StaticResource validationErrorTemplate}">
<TextBox.Text>
<Binding Path="Name" Mode="TwoWay"
UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<validators:UserNameValidator/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
我还写了一个自定义验证器:
using System.Windows.Controls;
namespace PolovniDijelovi.Validators.LogIn
{
class UserNameValidator : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value.ToString() == string.Empty)
{
return new ValidationResult(false, "Korisničko ime ne može biti prazno.");
}
else if (value.ToString().Length > 12)
{
return new ValidationResult(false, "Korisničko ime ne može sadržati više od 12 znakova.");
}
return ValidationResult.ValidResult;
}
}
}
毕竟它不起作用。当我在UserNameValidator
类中设置断点时,它永远不会碰到那个断点。
我是初学者,找不到解决办法。请帮忙。
尝试以下方式,以您喜欢的方式扩展error
"视觉效果"。
有一个带有style
和validation template
的文本框
<TextBox Name="textBox1"
Validation.ErrorTemplate="{StaticResource validationTemplate}"
Style="{StaticResource textBoxInError}"
Grid.Row="1" Grid.Column="1" Margin="2">
<TextBox.Text>
<Binding Path="Name"
UpdateSourceTrigger="LostFocus" >
<Binding.ValidationRules>
<validators:UserNameValidator/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
为ErrorTemplate
:创建control template
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<Ellipse Width="12" Height="12"
Fill="Red" HorizontalAlignment="Center"
VerticalAlignment="Center"/>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
为文本框创建style
,并将工具提示作为错误内容:请注意,只要出现通过触发器设置的错误,就会设置工具提示。
<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>