zoukankan      html  css  js  c++  java
  • WPF 验证表单方法1

    效果如图

    验证表单的关键是使用ValidationRule,官方资料:ValidationRule 类How to: Implement Binding Validation

    继承ValidationRule实现验证类

    public class LengLimitValidationRule: ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string str = value as string;
            if (str != null)
            {
                if (!CanBeNull && str.Length == 0)
                {
                    return new ValidationResult(false, CanNotBeNullMessage);
                }
                if (str.Length >= MinLength && str.Length <= MaxLength)
                {
                    return ValidationResult.ValidResult;
                }
                if (str.Length > MaxLength)
                {
                    return new ValidationResult(false, string.Format(MaxLengthMessage, MaxLength));
                }
                if (str.Length < MinLength)
                {
                    return new ValidationResult(false, string.Format(MinLengthMessage, MinLength));
                }
            }
            else
            {
                if (CanBeNull)
                {
                    return ValidationResult.ValidResult;
                }
                else
                {
                    return new ValidationResult(false, CanNotBeNullMessage);
                }
            }
            return new ValidationResult(false, CanNotBeNullMessage);
        }
        public bool CanBeNull { get; set; }
        public long MinLength { get; set; }
        public long MaxLength { get; set; }
        public String MinLengthMessage { get; set; }
        public String MaxLengthMessage { get; set; }
        public String CanNotBeNullMessage { get; set; }
    }
    

    为输入框添加验证

    <Label Content="姓名"></Label>
    <TextBox x:Name="nameTextBox" TextChanged="TextBox_TextChanged">
        <TextBox.Text>
            <Binding Path="Name" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                <Binding.ValidationRules>
                    <validations:LengLimitValidationRule ValidatesOnTargetUpdated="True"
                                                         CanBeNull="False"
                                                         CanNotBeNullMessage="必须填写姓名"
                                                         MinLength="2"
                                                         MaxLength="20"
                                                         MinLengthMessage="最小长度为{0}"
                                                         MaxLengthMessage="最大长度为{0}"/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    

    监测输入行为,修改提交按钮可用性

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        ResetSubmitButton();
    }
    
    private void ResetSubmitButton()
    {
        var b1 = Validation.GetHasError(nameTextBox);
        var b2 = Validation.GetHasError(ageTextBox);
        var b3 = Validation.GetHasError(remarkTextBox);
    
        submitButton.IsEnabled = !b1 && !b2 && !b3;
    }
    

    初始化的时候也要加上判断

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        ResetSubmitButton();
    }
    

    错误信息显示

    <Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
            </Trigger>
        </Style.Triggers>
    </Style>
    

    示例代码

    ValidationForm1

    参考资料

    ValidationRule 类
    How to: Implement Binding Validation
    How to disable a Button on TextBox ValidationErrors in WPF
    Accessing WPF control validation rules from code

  • 相关阅读:
    BZOJ3992 [SDOI2015]序列统计
    BZOJ3991 [SDOI2015]寻宝游戏
    BZOJ4007 [JLOI2015]战争调度
    BZOJ4006 [JLOI2015]管道连接
    BZOJ4004 [JLOI2015]装备购买
    P2567 [SCOI2010]幸运数字
    P1447 [NOI2010]能量采集
    比赛-Round 2 (11 Jul)
    题解-弹飞绵羊 (HNOI2015)
    归并排序模板
  • 原文地址:https://www.cnblogs.com/Lulus/p/13786177.html
Copyright © 2011-2022 走看看