DataAnnotations方法定义WPF输入异常祥解

原创 2013年12月03日 14:24:55

在MVVM中,我们一般将前台xaml需绑定的变量统一写在ViewModel中,而对于数据的验证,也会在viewModel中进行处理:

这里详解DataAnnotations方法:

首先ViewModel需要引用System.ComponentModel.DataAnnotations,接下来我们需要为viewModel建立viewModelBase类,方便所有viewModel统一处理验证,

base类中可写的东西有很多,这边列出2个我们需要的方法:

    public class ViewModelBase : IDataErrorInfo
    {
        public string this[string columnName]
        {
            get
            {
                var validationResults = new List<ValidationResult>();
                if (Validator.TryValidateProperty(GetType().GetProperty(columnName).GetValue(this, null),
                                                  new ValidationContext(this, null, null) { MemberName = columnName },
                                                  validationResults))
                {
                    return null;
                }
                return validationResults.First().ErrorMessage;
            }
        }

        protected bool IsValid()
        {
            return Validator.TryValidateObject(
                this, new ValidationContext(this, null, null), new List<ValidationResult>(), true);
        }
    }
这样以后,我们就能在viewModel中进行相关验证了“:

    public class SampleViewModel : ViewModelBase
    {
        public int ID { get; set; }

        [Display(Name = "Condition Name")]
        [Required(ErrorMessageResourceName = ValidationErrorMessagesResourceNames.Required,
            ErrorMessageResourceType = typeof(ValidationErrorMessages))]
        [StringLength(30, ErrorMessageResourceName = ValidationErrorMessagesResourceNames.StringMaximumLength,
            ErrorMessageResourceType = typeof(ValidationErrorMessages))]
        public string Name { get; set; }
    }

提示的message可以自定义resource,而DataAnnotations
 [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter,
        AllowMultiple = false)]
    public class StringValidate : ValidationAttribute
    {
         private static readonly Regex InvalidRegex 
             = new Regex(@"[^a-zA-Z0-9 -/:-@\[-\`\{-\~]");

        public StringValidate()
            : base(() => "Error string")
        {
        }

         public override bool IsValid(object value)
         {
             var s = Convert.ToString(value);

             if (string.IsNullOrEmpty(s)) return true;

             return !InvalidRegex.IsMatch(s);
         }
    }

最后我们的viewModel就能变成:

 public class SampleViewModel : ViewModelBase
    {
        public int ID { get; set; }

        [Display(Name = "Condition Name")]
        [Required(ErrorMessageResourceName = ValidationErrorMessagesResourceNames.Required,
            ErrorMessageResourceType = typeof(ValidationErrorMessages))]
        [StringLength(30, ErrorMessageResourceName = ValidationErrorMessagesResourceNames.StringMaximumLength,
            ErrorMessageResourceType = typeof(ValidationErrorMessages))]
        [StringValidate]
        public string Name { get; set; }
    }

即Name只限输入英语,数字,符号,别的全角字符一律不行。


最后,在xmal中定义以下style:

    <Style x:Key="TextBoxStyleBase" TargetType="TextBox">
        <Style.Triggers>
            <!-- Validation エラー時にエラー内容を ToolTip 表示する -->
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip"
                        Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource Mode=Self}}" />
            </Trigger>
        </Style.Triggers>
    </Style>

这里提示是用tooltip提示,当然还可以用adornedElementPlaceHolder这种旁边的修饰框

  <Style x:Key="ValidateTextBoxStyle" TargetType="TextBox">
                        <Style.Triggers>
                        <Trigger Property="Validation.HasError" Value="true">
                            <Setter Property="Validation.ErrorTemplate">
                                <Setter.Value>
                                    <ControlTemplate>
                                        <DockPanel LastChildFill="True">
                                            <TextBlock DockPanel.Dock="Left" Background="Red" Foreground="White" FontSize="11" Height="17"
                                                       Width="Auto"
                                                       VerticalAlignment="Center" TextAlignment="Center" TextWrapping="Wrap" FontFamily="Arial" 
                                                 Text="{Binding ElementName=ErrorBox, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                                            </TextBlock>
                                            <AdornedElementPlaceholder Name="ErrorBox" />
                                        </DockPanel>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </Style.Triggers>
                    </Style>

最后在binding的时候设置ValidatesOnDataErrors=true就可以了

使用DataAnnotations实现数据验证

在Entity Framworik(Module)中有两种配置:一种 DataAnnotaions(注释)与Fluent API.这些根据个人喜欢来使用,DataAnnotaions 配置相对简单些,...
  • sven_xu
  • sven_xu
  • 2015年06月02日 09:22
  • 1121

WPF之Validation

WPF在中国没有大规模的推开,但是这并不掩饰她的魅力。最近学到了Validation,记录下。 WPF中的Validation有以下几种: ValidationRuleIDataErrorInfoI...
  • psh2009
  • psh2009
  • 2016年03月30日 19:40
  • 1142

WPF数据验证(6)—— IDataErrorInfo + DataAnnotations

前面介绍过居于 IDataErrorInfo 接口的数据验证。利用 IDataErrorInfo 的好处是它可用于轻松地处理交叉耦合属性。但也具有一个很大的弊端:索引器的实现通常会导致较大的 swit...
  • iHuoBaby
  • iHuoBaby
  • 2013年02月07日 20:47
  • 919

使用Data Annotations进行手动数据验证

http://www.cnblogs.com/TianFang/p/3606285.html Data Annotations是在Asp.Net中用于表单验证的,它通过Attribute直接...
  • zunguitiancheng
  • zunguitiancheng
  • 2016年03月07日 17:59
  • 380

第6章 数据注解 System.ComponentModel.DataAnnotations 、注解后台原理、自定义验证ValidationAttribute、IValidatableObject

客户端验证对用户向表单中输入的数据给出一个即时反馈。 服务器验证,主要是因为来自网络的信息都是不能信任的。 一、 为验证注解订单 1 、验证注解的使用,自定义错误提示消息 数据注解特性定义在 Syst...
  • tiz198183
  • tiz198183
  • 2017年11月18日 14:21
  • 241

如何:使用 DataAnnotations 特性验证模型数据

NET Framework 4 本主题阐释了如何使用 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据模型中...
  • guoshaoqing001
  • guoshaoqing001
  • 2015年08月12日 15:57
  • 1168

Asp.Net MVC 使用 DataAnnotations 进行模型验证

通过为模型类增加数据描述的 DataAnnotations ,我们可以容易地为应用程序增加验证的功能。DataAnnotations 允许我们描述希望应用在模型属性上的验证规则,ASP.NET MV...
  • hack8
  • hack8
  • 2015年10月04日 11:48
  • 1468

物联网产业链全景图及8大环节超详解读

2006年,谷歌CEO埃里克在搜索引擎大会首次提出“云计算”的概念,直到近两年才被亚马逊、阿里、微软等公司大规模商业化。此时的物联网,概念已经诞生13年。随着产业多年发展,也即将迎来爆发期。无需用“千...
  • zw0Pi8G5C1x
  • zw0Pi8G5C1x
  • 2017年12月29日 00:00
  • 477

[转载]C#特性详解

在Java中有反射和注解这个东西,可以很方便的完成数据库相关的一些操作,于是我想在C#中利用类似的技术来实现一些数据库相关的工作,但是不知道在C#中这项技术叫什么,于是在MSDN上面找,找了好一会发现...
  • CQ_Wacky
  • CQ_Wacky
  • 2015年07月06日 10:39
  • 470

Java必知必会:异常机制详解

一、Java异常概述 在Java中,所有的事件都能由类描述,Java中的异常就是由java.lang包下的异常类描述的。1、Throwable(可抛出):异常类的最终父类,它有两个子类,Error与...
  • zhangliangzi
  • zhangliangzi
  • 2016年05月01日 17:52
  • 4881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DataAnnotations方法定义WPF输入异常祥解
举报原因:
原因补充:

(最多只允许输入30个字)