如何成功实现WPF文本框验证?

3

我正在尝试为WPF应用程序实现简单的文本框验证,但是遇到了一些问题。

我使用了这个指南:http://www.codeproject.com/Tips/690130/Simple-Validation-in-WPF

我的MainWindow.xaml中的文本框:

     <TextBox x:Name="textbox1" HorizontalAlignment="Left" Height="23" 
             Margin="93,111,0,0" TextWrapping="Wrap" VerticalAlignment="Top" 
             Width="120" Style="{StaticResource textBoxInError}"
             Validation.ErrorTemplate="{StaticResource validationErrorTemplate}">
        <TextBox.Text>
            <Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <local:NameValidator/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

MainWindow.xaml.cs中的NameValidator类:

    public class NameValidator : ValidationRule 
    {
      public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
      {
        if (value == null)
            return new ValidationResult(false, "value cannot be empty.");
        else
        {
            if (value.ToString().Length > 3)
                return new ValidationResult(false, "Name cannot be more than 3 characters long.");
        }
        return ValidationResult.ValidResult;
      }
  }

我的静态资源在App.xaml中:

        <ControlTemplate x:Key="validationErrorTemplate">
            <DockPanel>
                <TextBlock Foreground="Red" DockPanel.Dock="Top">!</TextBlock>
                <AdornedElementPlaceholder x:Name="ErrorAdorner"></AdornedElementPlaceholder>
            </DockPanel>
        </ControlTemplate>
        <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>

我可以成功运行应用程序,但是验证却从未被触发。


哪一部分出了问题?触发器?验证方法?等等。 - bill
抱歉,我的问题表述不够清晰。我已经更新了问题并附上了屏幕录像。没有任何验证触发,并且在启动应用程序时也没有错误。 - user4681776
我在查看您提供的代码,也许是我眼瞎了,但我没有看到任何订阅任何文本框控件事件(lostfocus,textchanged等)的代码。当您在文本框中输入时,您是如何触发验证的? - bill
嘿,比尔,我已经尝试了PropertyChanged和LostFocus,但都没有给我任何结果。<Binding Path="Name" UpdateSourceTrigger="PropertyChanged">。这应该在绑定标记中的Textbox.Text中,对吗? - user4681776
1
你确定在文本框中输入文本时会触发 "PropertyChanged" 事件吗?你提供的示例教程使用的是 lostfocus。如果你尝试使用该事件,它是否有效? - bill
显示剩余2条评论
1个回答

6
使用您发布的代码,对我而言可以正常工作,它会在文本框上方产生红色的“!”。但是,我确实记得设置了我的DataContext,也就是说。
public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

没有这个,它就无法工作。

哇,谢谢。搞定了,我只是个新手。 - user4681776

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接