精华内容
下载资源
问答
  • WPF 数据验证

    2011-12-15 14:02:49
    WPF 数据验证,下载即可作用;界面写入提示信息;自动判断信息的种类;在鼠标放在控件上自动显示提示信息。
  • wpf 数据验证

    2013-08-02 11:06:23
    wpf中如何进行数据验证,实现自定义的popup提示
  • WPF数据验证

    2019-07-08 11:27:17
    当填写表单时,需要对填写的内容进行验证,检查数据是否符合要求,比如字符串的长度、日期的格式、数字等。WPF支持自定义验证规则,并提供可视化反馈,以便在输入无效值时向用户发出通知。 下面的示例将演示一个模拟...

    当填写表单时,需要对填写的内容进行验证,检查数据是否符合要求,比如字符串的长度、日期的格式、数字等。WPF支持自定义验证规则,并提供可视化反馈,以便在输入无效值时向用户发出通知。

    下面的示例将演示一个模拟员工信息录入的过程,如果年龄不再给定的输入范围内,将在文本框的后面显示一个红色的叹号,当鼠标移至错误文本框时,显示提示消息,提示用户正确的输入格式。

    主要内容为:自定义验证规则、定义输入错误时控件的外观、定义样式触发器显示错误提示

    自定义验证规则

    可以继承ValidationRule类,重写Validate方法,实现自定义的验证规则

    下面是年龄的验证规则的实现:

        public class AgeRangeRule : ValidationRule
        {
            private int _min;
            private int _max;
    
            public AgeRangeRule()
            {
    
            }
    
            public int Min
            {
                get { return _min; }
                set { _min = value; }
            }
    
            public int Max
            {
                get { return _max; }
                set { _max = value; }
            }
    
            public override ValidationResult Validate(object value, CultureInfo cultureInfo)
            {
                int age = 0;
                try
                {
                    if (((string)value).Length > 0)
                        age = Int32.Parse((String)value);
                }
                catch (Exception e)
                {
                    return new ValidationResult(false, "输入的数字无效!");
                }
    
                if ((age < Min) || (age > Max))
                {
                    return new ValidationResult(false,
                      "输入的年龄范围必须在: " + Min + " - " + Max + "之间");
                }
                else
                {
                    return new ValidationResult(true, null);
                }
            }
        }
    View Code

    定义输入错误时控件的外观

    自定义的 ControlTemplate,它用于创建一个红色感叹号,以通知用户验证错误。 控件模板用于重新定义控件的外观。

    <ControlTemplate x:Key="validationTemplate">
      <DockPanel>
        <AdornedElementPlaceholder/>
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
      </DockPanel>
    </ControlTemplate>

    定义样式触发器显示错误提示

    显示错误消息的 ToolTip 是使用名为 textBoxInError 的样式创建的。 如果 HasError 的值是 true,则触发器将当前 TextBox 的工具提示设置为其第一个验证错误。 RelativeSource 设置为 Self,以引用当前元素。

    <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>

     

    控件绑定相应的模板和样式

    <TextBox Name="textBox1" Width="50" FontSize="15"
             Validation.ErrorTemplate="{StaticResource validationTemplate}"
             Style="{StaticResource textBoxInError}"
             Grid.Row="1" Grid.Column="1" Margin="2">
      <TextBox.Text>
        <Binding Path="Age" Source="{StaticResource employee}"
                 UpdateSourceTrigger="PropertyChanged" >
          <Binding.ValidationRules>
            <c:AgeRangeRule Min="21" Max="130"/>
          </Binding.ValidationRules>
        </Binding>
      </TextBox.Text>
    </TextBox>

    当输入的年龄不在定义范围内时,控件的显示方式如下:

    SNAGHTML18d97c4

    注:当数据绑定验证时,如果验证规则的ValidationStep属性设置为RawProposedValue或ConvertedProposedValue值时,在验证失败的情况下,数据不会更新到源,这也在情理之中,不合格的数据我们当然不接受。

    转载于:https://www.cnblogs.com/guofeiji/p/5517094.html

    展开全文
  • WPF数据校验的一种实现方式

    千次阅读 2019-06-12 11:13:06
    总所周知,WPF提供了多种数据校验的方式,但是在实际应用中并不是那么得心应手,每种验证都有自己的缺点。ValidationRule 验证比较繁琐,Exception 验证需要书写的逻辑比较多,IDataErrorInfo 验证初始化的时候即...

    总所周知,WPF提供了多种数据校验的方式,但是在实际应用中并不是那么得心应手,每种验证都有自己的缺点。ValidationRule 验证比较繁琐,Exception 验证需要书写的逻辑比较多,IDataErrorInfo 验证初始化的时候即进行验证,然后如果是需要确定的界面,确定的时候还是需要一次校验。以前的时候都是放弃了校验,依旧采取确认的时候判断每个需要校验的属性,然后提示。最近在新做一个项目的时候,研究了一下校验方式及网上的一些实现方式,在此提出一种实现,供大家参考。
    代码如下:

    /// <summary>
    /// 带有数据校验功能的通知基类
    /// </summary>
    public class ViewModelValidationBase : ViewModelBase, IDataErrorInfo
    {
        /// <summary>
        /// 需要校验的属性集合
        /// </summary>
        private List<string> validationKeys = new List<string>();
        /// <summary>
        /// 错误信息字典
        /// </summary>
        private Dictionary<string, string> errorDic = new Dictionary<string, string>();
        /// <summary>
        /// 是否开始校验,以此控制IDataErrorInfo接口校验的时候界面刚初始化即开始校验
        /// </summary>
        public bool IsBeginValidation { get; set; }
        public string this[string columnName]
        {
            get
            {
                if (!IsBeginValidation)
                {
                    return string.Empty;
                }
                var vc = new ValidationContext(this, null, null);
                vc.MemberName = columnName;
                var res = new List<ValidationResult>();
                var result = Validator.TryValidateProperty(this.GetType().GetProperty(columnName).GetValue(this, null), vc, res);
                if (res.Count > 0)
                {
                    string errorMessage = string.Join(Environment.NewLine, res.Select(r => r.ErrorMessage).ToArray());
                    AddErrorDic(columnName, errorMessage);
                    return errorMessage;
                }
                RemoveErrorDic(columnName);
                return string.Empty;
            }
        }
    
        public string Error => string.Join(Environment.NewLine, errorDic.Values.ToArray());
        /// <summary>
        /// 添加进行校验的属性集合
        /// </summary>
        /// <param name="keys"></param>
        protected virtual void ValidationKey(string[] keys)
        {
            if (keys == null)
            {
                return;
            }
            foreach (var item in keys)
            {
                validationKeys.Add(item);
            }
        }
        /// <summary>
        /// 强制进行以此校验
        /// </summary>
        protected void Validation()
        {
            if (validationKeys != null)
            {
                foreach (var item in validationKeys)
                {
                    RaisePropertyChanged(item);
                }
            }
        }
    
        private void AddErrorDic(string key, string value)
        {
            if (!errorDic.Keys.Contains(key))
            {
                errorDic.Add(key, value);
            }
        }
        private void RemoveErrorDic(string key)
        {
            errorDic.Remove(key);
        }
    }
    

    其中ViewModelBase类我使用的是MVVMLight中的通知基类。
    使用的时候继承该类,然后使用属性IsBeginValidation控制校验的时机,方法 ValidationKey(string[] keys) 添加需要校验的属性,方法Validation()可以触发校验,属性Error显示校验信息,为空则校验正确,不为空校验错误。
    校验规则是使用特性的方式,引用名称空间
    using System.ComponentModel.DataAnnotations;

        /// <summary>
        /// 获取或设置
        /// </summary>
        private string name;
        /// <summary>
        /// 获取或设置
        /// </summary>
        [Required(ErrorMessage = "用户名称不能为空")]
        public string Name
        {
            get { return name; }
            set { Set<string>(ref name, value, "Name"); }
        }
    

    如果大家有什么更好的意见欢迎讨论。

    展开全文
  • 深入剖析WPF数据验证

    2019-04-16 02:43:35
    1、WPF包含的验证方式 方式 父类 对应接口 处理方式 简便写法 默认值 ExceptionValidationRule ValidationRule 无 ...

    1、WPF包含的验证方式

    方式

    父类

    对应接口

    处理方式

    简便写法

    默认值

    ExceptionValidationRule 

    ValidationRule

    检查在更新数据源(Source)时抛出的异常

    ValidatesOnExceptions=True

    false

    DataErrorValidationRule

    ValidationRule

    IDataErrorInfo

    检查实现了IDataError接口的对象生成的错误

    ValidatesOnDataErrors=True

    false

    NotifyDataErrorValidationRule

    ValidationRule

    INotifyDataErrorInfo

    检查实现了INotifyDataErrorInfo接口的对象生成的错误

    ValidatesOnNotifyDataErrors=True

    true

    说明:

    1、如果一个Binding的ValidationRules设置了ExceptionValidationRule或在Binding中直接指定ValidateOnException=true,那么它捕获属性中抛出的异常,参照下面的详细示例

    2、对应的如果一个Binding的ValidationRules设置了DataErrorValidationRule或NotifyDataErrorValidationRule,或直接在Binding中指定ValidateOnDataError或ValidateOnNotifyDataErrors,那么它捕获实现对应接口的错误

    2、ValidationStep属性,默认是:RawProposedValue,对于DataErrorValidationRule来说,默认是UpdatedValue

    <ExceptionValidationRule ValidationStep="RawProposedValue" />
        //
        // Summary:
        //     确定何时执行ValidationRule
        public enum ValidationStep
        {
            //
            // Summary:
            //     在数据没有转换之前(应用Converter)之前执行ValidationRule
            RawProposedValue = 0,
            //
            // Summary:
            //     在数据转换发生之后,赋值给source之前执行ValidationRule
            ConvertedProposedValue = 1,
            //
            // Summary:
            //     在source的值更新之后执行ValidationRule
            UpdatedValue = 2,
            //
            // Summary:
            //     在数据提交之后执行ValidationRule
            CommittedValue = 3
        }

    3、在UI上显示错误信息

    • 指定Validation.ErrorTemplate(AdornedElementPlaceholder是输入控件,如TextBox的占位符)

            <ControlTemplate x:Key="validationTemplate">
                <DockPanel>
                    <TextBlock Foreground="Red"  FontSize="20">!</TextBlock>
                    <AdornedElementPlaceholder/>
                </DockPanel>
            </ControlTemplate>
    • 使用Style指定错误样式
            <Style x:Key="textStyleTextBox" TargetType="TextBox">
                <Setter Property="Foreground" Value="#333333" />
                <Setter Property="MaxLength" Value="40" />
                <Setter Property="Width" Value="392" />
                <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>

    4、Validation处理过程

    数据验证发生在TwoWay和OneWayToSource的Binding中

    验证流程(如果有一个错误发生,验证流程终止)

    1. 绑定引擎(Binding engine)检查ValidationStep设置为RawProposedValue的任意自定义ValidationRule

    2. 绑定引擎调用Converter(如果有Converter)

    3. 如果转换成功,绑定引擎检查ValidationStep设置为ConvertedProposedValue的任意自定义ValidationRule

    4. 绑定引擎设置source属性

    5. 绑定引擎调用Validate方法,检查ValidationStep设置为UpdatedValue的任意自定义ValidaRule。

      1. 如果Binding中包含DataErrorValidationRule,并且ValidationStep设置为Default(UpdatedValue),此时检查DataErrorValidationRule

      2. 此时也是ValidatesOnDataErrors设置为true的默认检查时机

    6. 绑定引擎调用Validate方法检查ValidationStep设置为CommittedValue的ValidationRule

     

    5、说明:

    • 如果一个ValidationRule在某一个时机/步骤没有检查通过,绑定引擎创建一个ValidationError对象,并添加到绑定元素的Errors集合,在此之前,绑定引擎会移除之前此步骤添加的ValidationError对象。例如:如果一个ValidationRule在UpdatedValue步骤没有检查通过,那么下次检查UpdatedValue时机的任意ValidationRule之前,会把之前添加的ValidationError对象移除

    • Errros不为空时,元素的附加属性HasError会设置为true,如果Binding的NotifyOnValidationError=true,那么绑定引擎会触发元素的附加事件Validation.Error

    • 如果一个验证通过的值从source传递到target(或从target传递到source)时,Errors集合会清空

    6、ValidationRule.ValidatesOnTargetUpdated属性(默认false)

    <local:ValueIsNotNullValidationRule  ValidatesOnTargetUpdated="True" />
            private RelayCommand loadCommand;
            /// <summary>
            /// Gets the LoadCommand.
            /// </summary>
            public RelayCommand LoadCommand
            {
                get
                {
                    return loadCommand
                        ?? (loadCommand = new RelayCommand(
                        () =>
                        {
                            UserName = null;
                        }));
                }
            }

    如果直接给source赋值时(更新到target),会触发检查ValidatioRule。

     

    7、当使用ExceptionValidationRule或ValidateOnExceptions=true时,你可以使用 UpdateSourceExceptionFilter处理验证发出的异常,如果没有 UpdateSourceExceptionFilter,Binding引擎会创建一个ValidationError。

    示例:

    BindingExpression myBindingExpression =  textBox.GetBindingExpression(TextBox.TextProperty);
    Binding myBinding =  myBindingExpression.ParentBinding;
    myBinding.UpdateSourceExceptionFilter = new  UpdateSourceExceptionFilterCallback(ReturnExceptionHandler);
    myBindingExpression.UpdateSource();
            object ReturnExceptionHandler(object bindingExpression,  Exception exception)
            {
                return "This is from the  UpdateSourceExceptionFilterCallBack.";
            }

    8、ExceptionValidationRule 详细示例:它的简便写法是直接在binding设置ValidatesOnExceptions为True,即:下面两种写法效果相同

            <TextBox
                Grid.Column="1"
                Width="200"
                HorizontalAlignment="Left">
                <TextBox.Text>
                    <Binding
                        Mode="TwoWay"
                        Path="UserName"
                        UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <ExceptionValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
             <TextBox
                Grid.Row="1"
                Grid.Column="1"
                Width="200"
                HorizontalAlignment="Left"
                Text="{Binding Email, Mode=TwoWay,  ValidatesOnExceptions=True,  UpdateSourceTrigger=PropertyChanged}" />

    详细示例:

            <Style x:Key="validationTextBoxStyle"  TargetType="TextBox">
                <Setter Property="VerticalAlignment" Value="Center"  />
                <Style.Triggers>
                    <Trigger Property="Validation.HasError"  Value="true">
                        <Setter Property="ToolTip" Value="{Binding  (Validation.Errors)[0].ErrorContent,  RelativeSource={RelativeSource Mode=Self}}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
            <TextBox
                x:Name="tbUserName"
                Grid.Column="1"
                Width="200"
                HorizontalAlignment="Left"
                Style="{DynamicResource validationTextBoxStyle}">
                <TextBox.Text>
                    <Binding
                        Mode="TwoWay"
                        Path="UserName"
                        UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <ExceptionValidationRule  ValidationStep="RawProposedValue" />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
            private string userName;
            public string UserName
            {
                get { return userName; }
                set
                {
                    if (string.IsNullOrWhiteSpace(value))
                    {
                        throw new Exception("用户名不能为空");
                    }
                    if (value.Length < 5)
                    {
                        throw new Exception("用户名长度不能小于5个字符");
                    }
                    if (value != userName)
                    {
                        userName = value;
                        RaisePropertyChanged(() => this.UserName);
                    }
                }
            }

    9、IDataErrorInfo示例

        public class BaseViewModel : ViewModelBase, IDataErrorInfo
        {
            protected Dictionary<string, string> errorList = new  Dictionary<string, string>();
            public string this[string columnName] =>  errorList.ContainsKey(columnName) ? errorList[columnName] :  string.Empty;
            public string Error => errorList.Count > 0 ?  errorList.FirstOrDefault().Value : string.Empty;
        }
            private string email;
            public string Email
            {
                get { return email; }
                set
                {
                    if (string.IsNullOrWhiteSpace(value))
                    {
                        errorList.Add("Email", "Email不能为空");
                        return;
                    }
                    if (value != email)
                    {
                        email = value;
                        RaisePropertyChanged(() => this.Email);
                    }
                }
            }
            <TextBox
                Grid.Row="1"
                Grid.Column="1"
                Width="200"
                HorizontalAlignment="Left"
                Style="{DynamicResource validationTextBoxStyle} "
                Text="{Binding Email, Mode=TwoWay,  ValidatesOnDataErrors=True,  UpdateSourceTrigger=PropertyChanged}" />

    10、INotifyDataErrorInfo示例

        public class BaseViewModel1 : ViewModelBase,  INotifyDataErrorInfo
        {
            protected Dictionary<string, string> errorList = new  Dictionary<string, string>();
            public bool HasErrors => errorList.Count > 0;
            public event EventHandler<DataErrorsChangedEventArgs>  ErrorsChanged;
            public IEnumerable GetErrors(string propertyName)
            {
                if (errorList.ContainsKey(propertyName))
                {
                    yield return errorList[propertyName];
                }
            }
        }

     

            private string email;
            public string Email
            {
                get { return email; }
                set
                {
                    if (string.IsNullOrWhiteSpace(value))
                    {
                        errorList.Add("Email", "Email不能为空");
                        return;
                    }
                    if (value != email)
                    {
                        email = value;
                        RaisePropertyChanged(() => this.Email);
                    }
                }
            }
            <TextBox
                Grid.Row="1"
                Grid.Column="1"
                Width="200"
                HorizontalAlignment="Left"
                Style="{DynamicResource validationTextBoxStyle}"
                Text="{Binding Email, Mode=TwoWay,  ValidatesOnNotifyDataErrors=True,  UpdateSourceTrigger=PropertyChanged}" />

    11、INotifyDataErrorInfo高级示例(使用特性——Attribute实现验证)

            <TextBox
                Grid.Row="1"
                Grid.Column="1"
                Width="200"
                HorizontalAlignment="Left"
                Style="{DynamicResource validationTextBoxStyle}"
                Text="{Binding Email, Mode=TwoWay,  ValidatesOnNotifyDataErrors=True,  UpdateSourceTrigger=PropertyChanged}" />

    其实ValidatesOnNotifyDataErrors默认是true,不用设置也可以,下面的RequiredLooseAttribute继承自:ValidationAttribute,在

    System.ComponentModel.DataAnnotations命名空间下,需要引用该dll。
    
        /// <summary>
        /// 默认允许为null和string.empty,不允许为空白字符
        /// </summary>
        [AttributeUsage(AttributeTargets.Property, AllowMultiple =  false)]
        public class EmailAddressEmptyAttribute :  RequiredLooseAttribute
        {
            protected override bool IsValidString(string  inputString)
            {
                string regPattern =  @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";
                Regex reg = new Regex(regPattern);
                return reg.IsMatch(inputString);
            }
        }
    
    
        public class ExceptionValidationViewModel :  BaseViewModelWithValidation
        {
            private string email = "11";
            [EmailAddressEmpty(AllowNullOrEmptyString = false,  AllowWhiteSpace = false, ErrorMessage = "请输入合法的Email")]
            public string Email
            {
                get { return email; }
                set
                {
                    if (value != email)
                    {
                        email = value;
                        RaisePropertyChanged(() => this.Email);
                    }
                }
            }
        }
        public abstract class BaseViewModelWithValidation :  BaseViewModel, INotifyDataErrorInfo
        {
            private Dictionary<string, List<string>> allErrorList =  new Dictionary<string, List<string>>();
            public bool HasErrors => allErrorList != null &&  allErrorList.Count > 0;
            public event EventHandler<DataErrorsChangedEventArgs>  ErrorsChanged;
            protected void NotifyErrorsChanged(string propName)
            {
                ErrorsChanged?.Invoke(this, new  DataErrorsChangedEventArgs(propName));
            }
    
            public IEnumerable GetErrors(string propertyName)
            {
                if (allErrorList != null &&  allErrorList.ContainsKey(propertyName))
                {
                    List<string> errors = allErrorList[propertyName];
                    foreach (var item in errors)
                    {
                        yield return item;
                    }
                }
                yield break;
            }
    
            public override void  RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
            {
                base.RaisePropertyChanged(propertyExpression);
                ValidateProperty(propertyExpression);
            }
    
            protected bool ValidateProperty<T>(Expression<Func<T>>  propExpression)
            {
                string propName = GetPropertyName(propExpression);
                object propValue =  GetType().GetProperty(propName).GetValue(this);
                bool isValid = ValidateProperty(propName, propValue);
                return isValid;
            }
    
            protected bool ValidateProperty(string propName, object  value)
            {
                var validationResults = new List<ValidationResult>();
                ValidationContext context = new  ValidationContext(this) { MemberName = propName };
                bool isValid = Validator.TryValidateProperty(value,  context, validationResults);
                if (isValid)
                {
                    RemoveErrorsForProperty(propName);//移除所有的Error
                }
                else
                {
                    AddErrorsForProperty(propName,  validationResults);//添加Error
                }
                return isValid;
            }
        }

    12、总结

    通过三种验证方式的比较,实际项目中用的最多的就是后两种,IDataErrorInfo和INotifyDataErrorInfo,即实现好通用的ViewModel基类之后,使用特性Attribute来给Property校验。

    值得一提的是,IDataErrorInfo也可以通过自定义Attribute来实现验证,通过实现IDataErrorInfo的BaseViewModel中通过反射获取属性的Attribute实现

    var attr = Attribute.GetCustomAttributes(propInfo,  typeof(ValidationBaseAttribute))
    string error = attr.Validate(value);
        [AttributeUsage(AttributeTargets.Property, AllowMultiple  =true)]
        public class ValidationBaseAttribute : Attribute
        {
            public ValidationBaseAttribute()
            {
                
            }
            public string ErrorMessage{ get; set; }
            
            public virtual string Validate(object value)
            {
                return string.Empty;
            }
        }

    因为Exception方式要对每个属性都写单独的验证代码(set方法中或者写ValidationRule),而且抛出异常本身就会影响性能,加剧WPF程序的性能问题(本身就够臃肿了……)

    展开全文
  • WPF数据验证方式

    2018-03-30 08:40:20
    WPF有两种数据验证的方式:1 在数据对象上进行验证:普通属性验证或者实现IDataErrorInfo接口2 可以再绑定规则上进行验证:ExceptionValidationRule异常验证规则 DataErrorValidationRule数据错误验证规则...

    WPF有两种数据验证的方式:

    1 在数据对象上进行验证:普通属性验证或者实现IDataErrorInfo接口

    2 可以再绑定规则上进行验证:ExceptionValidationRule异常验证规则 DataErrorValidationRule数据错误验证规则

    展开全文
  • 文章目录一、前言二、方法及步骤2.1 自定义验证规则2.2 数据...后端数据与前端数据绑定后可以实现数据的双向传递,同时在传递过程中,也能对数据进行一些操作,例如数据验证和数据转换,本篇文章重点介绍数据验证。 .
  • 虽然标题是wpf数据验证,但并不是对IDataErrorInfo、ValidationRule、属性中throwException这几种验证方式的介绍; 之前做项目时(例如员工工资管理),根据员工编号和年度月份验证 当月数据的唯一性,因为第一次开发...
  • WPF 数据验证实现步骤

    千次阅读 2010-11-10 16:05:00
      --- 数据验证   1、使用ValidationRule验证 需实现其子类,自定义验证规则,即重写Validate(object value, System.Globalization.CultureInfo cultureInfo)方法   2、需验证的...
  • wpf数据验证(转)

    千次阅读 2010-08-16 22:15:00
    :Beth Massi [原文链接]:Displaying Data Validation Messages in WPF   以下是我特别关注的内容:   设置自定义有效性验证Style  我们显然希望能让用户知道这里的问题怎么解决....
  • 最近发现在TabControl 中使用数据验证有个特别闹心的情况,就是在切换TabItem后验证效果居然没有了!!! 关键是红色的框框也没有了!!! TabItem01 块代码是优化后的,使用AdornerDecorator 作为TabItem顶层装饰...
  • ExceptionValidationRule 是预先构建的验证规则,它向WPF报告所以的异常。要使用 ExceptionValidationRule 验证规则,必须将它添加到 Binding.ValidationRules 集合中: Xaml: xmlns="http://sche
  • 下面代码演示了一个专门查找 TextBox 对象中非法数据的示例:   [csharp]   view plain   copy   private  void GetErrors(StringBuilder sb, DependencyObject obj){    foreach ...
  • 应用自定义验证规则的方法和应用自定义转换器的方法类似。该方法定义了一个 ValidationRule 的类,并且为了执行验证重写 Validate 方法。 public class PositivePriceRule : ValidationRule{ public override ...
  • 为了告知WPF使用 IDataErrorInfo 接口,并且当修改了一个属性后使用该接口检查错误,必须为 Binding.ValidationRules 集合添加 DataErrorValidationRule 验证规则: xmlns=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,202
精华内容 3,280
关键字:

wpf数据验证