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类中设置断点时,它永远不会碰到那个断点。

我是初学者,找不到解决办法。请帮忙。

WPF-XAML不会调用自定义验证器

尝试以下方式,以您喜欢的方式扩展error"视觉效果"。

有一个带有stylevalidation 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>