让IDataErrorInfo和ValidationAttribute结合实现基础验证

大家都知道微软在Asp.net Mvc中引入System.ComponentModel.DataAnnotations 命名空间,利用ValidationAttribute实现数据的校验,那么能不能把这种机制引入WinForm中呢?通过近两天的尝试发现,winform中很多组件都支持IDataErrorInfo接口实现的校验提示,我便想,如果让我们的这些校验特性的错误提示转到IDataErrorInfo接口实现中不久成功了吗?

下面就来尝试一下:

隐藏行号 复制代码 这是一段程序代码。
  1. public abstract class EntityBase : INotifyPropertyChanged, IDataErrorInfo
    
  2.     {
    
  3.         private readonly Dictionary<string, PropertyInfo> _propertyGetters=new Dictionary<string, PropertyInfo>();
    
  4.         private readonly Dictionary<string, ValidationAttribute[]> _validators=new Dictionary<string, ValidationAttribute[]>();
    
  5.         private readonly Type _type;
    
  6.         protected EntityBase()
    
  7.         {
    
  8.             _type = GetType();
    
  9.             LoadData();
    
  10.         }
    
  11.         #region 私?有D方?法¨
    
  12.         private void LoadData()
    
  13.         {
    
  14.             PropertyInfo[] properties = _type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
    
  15.             foreach (PropertyInfo propertyInfo in properties)
    
  16.             {
    
  17.                 //拥μ有D的?验é证¤特?性?
    
  18.                 object[] customAttributes = propertyInfo.GetCustomAttributes(typeof(ValidationAttribute), true);
    
  19.                 if (customAttributes.Length > 0)
    
  20.                 {
    
  21.                     _validators.Add(propertyInfo.Name, customAttributes as ValidationAttribute[]);
    
  22.                     _propertyGetters.Add(propertyInfo.Name, propertyInfo);
    
  23.                 }
    
  24.             }
    
  25.         }
    
  26.         /// 
    
  27.         /// 属?性?更ü改?通¨知a
    
  28.         /// 
    
  29.         /// 
    
  30.         private void OnPropertyChanged(string propertyName)
    
  31.         {
    
  32.             if (PropertyChanged != null)
    
  33.             {
    
  34.                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    
  35.             }
    
  36.         }
    
  37.         #endregion
    
  38. 
    
  39.         #region IDataErrorInfo Members
    
  40.         /// 
    
  41.         /// 实μ现?IDataErrorInfo接ó口ú(获?取?校£验é未′通¨过y的?错í误ó提á示?)
    
  42.         /// 
    
  43.         public string Error
    
  44.         {
    
  45.             get
    
  46.             {
    
  47.                 IEnumerable<string> errors = from d in _validators
    
  48.                                              from v in d.Value
    
  49.                                              where !v.IsValid(_propertyGetters[d.Key].GetValue(this,null))
    
  50.                                              select v.ErrorMessage;
    
  51.                 return string.Join(Environment.NewLine, errors.ToArray());
    
  52.             }
    
  53.         }
    
  54.         /// 
    
  55.         /// 实μ现?IDataErrorInfo接ó口ú()
    
  56.         /// 
    
  57.         /// 
    
  58.         /// 
          
          
    
  59.         public string this[string columnName]
    
  60.         {
    
  61.             get
    
  62.             {
    
  63.                 if (_propertyGetters.ContainsKey(columnName))
    
  64.                 {
    
  65.                     object value = _propertyGetters[columnName].GetValue(this,null);
    
  66.                     string[] errors = _validators[columnName].Where(v => !v.IsValid(value))
    
  67.                         .Select(v => v.ErrorMessage).ToArray();
    
  68.                     OnPropertyChanged("Error");
    
  69.                     return string.Join(Environment.NewLine, errors);
    
  70.                 }
    
  71.                 OnPropertyChanged("Error");
    
  72.                 return string.Empty;
    
  73.             }
    
  74.         }
    
  75.         #endregion
    
  76. 
    
  77.         #region INotifyPropertyChanged Members
    
  78.         public event PropertyChangedEventHandler PropertyChanged;
    
  79.         #endregion
    
  80.     }
    
<script language="javascript"> function CopyCode(key){var codeElement=null;var trElements=document.all.tags("ol");var i;for(i=0;i  

<script language="javascript"> function CopyCode(key){var codeElement=null;var trElements=document.all.tags("ol");var i;for(i=0;i 通过代码中的注释信息,应该很容易理解的

下面让我们的类继承该抽象类就可以了,下面是显示效果截图

image

短短的几十行代码,就实现了如此强大的功能,兴奋吧,当然要想让我们的框架实现更强大的验证功能,我们还可以实现自己的验证特性,这些在Asp.Net Mvc中已经司空见惯了,我就不多说了。

### 回答1: XAML 是一种用于创建用户界面的标记语言,而 IDataErrorInfo 是一个接口,用于实现数据验证和错误处理。在 XAML 中,可以使用 IDataErrorInfo 接口来验证用户输入,并在出现错误时向用户提供反馈。 要在 XAML 中使用 IDataErrorInfo,需要遵循以下步骤: 1. 实现 IDataErrorInfo 接口。这个接口需要实现两个属性:Error 和 Item。Error 属性返回一个字符串,表示整个数据对象的错误消息。Item 属性返回一个字符串,表示指定属性的错误消息。 2. 在 XAML 中绑定数据对象到控件。可以使用 Binding 或者 x:Bind 语法将数据对象绑定到控件上。 3. 在控件上设置 Validation.ErrorTemplate 属性。这个属性指定在出现错误时要显示的模板。可以使用 ControlTemplate 来创建模板。 4. 如果需要实时验证用户输入,则可以在控件上设置 Validation.ErrorTemplate 属性的值为 DynamicResource,并在数据对象中实现 INotifyPropertyChanged 接口,以便在属性值更改时通知控件。 例如,下面是一个使用 IDataErrorInfo 的例子: ```xml <TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"> <Validation.ErrorTemplate> <ControlTemplate> <DockPanel> <Border BorderBrush="Red" BorderThickness="2"> <AdornedElementPlaceholder /> </Border> <TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red" /> </DockPanel> </ControlTemplate> </Validation.ErrorTemplate> </TextBox> ``` 在这个例子中,TextBox 绑定到一个名为 Name 的属性。当出现数据错误时,将显示一个红色边框和一个错误消息。这个错误消息来自 IDataErrorInfo 接口的实现。 ### 回答2: XAML是一种用于创建用户界面的标记语言,而IDataErrorInfo是一个接口,它允许开发者在数据绑定时提供数据验证和错误信息。当使用XAML创建界面,并且界面中包含数据绑定时,我们可以实现IDataErrorInfo接口来进行数据验证和错误处理。 在XAML中,我们可以通过在绑定XAML元素时,使用ValidationRule来添加数据验证规则。通过设置ValidationRule的属性,我们可以在数据绑定时对输入的数据进行验证。如果验证失败,我们可以使用IDataErrorInfo接口的实现方法提供错误信息。 实现IDataErrorInfo接口需要实现两个成员:Error和this[string columnName]。Error属性提供整体错误信息,而this[string columnName]方法是用于根据列名提供特定表单项的错误信息。 当我们的绑定目标对象实现了IDataErrorInfo接口后,我们可以在XAML中使用Binding对象的ValidatesOnDataErrors属性来启用数据验证。当ValidatesOnDataErrors属性设置为True时,绑定会自动调用目标对象的IDataErrorInfo接口实现,从而获取错误信息并显示到界面上。 通过使用XAML和IDataErrorInfo接口,我们可以在数据绑定时对用户输入进行验证,并提供错误信息。这使得开发者能够更好地管理和处理用户输入错误,提高应用程序的稳定性和用户体验。 ### 回答3: XAML是一种用于定义用户界面的标记语言,并且可以与数据绑定一起使用。在数据绑定的过程中,我们可以使用XAML来验证用户输入的数据。而在WPF(Windows Presentation Foundation)应用程序中,我们可以利用IDataErrorInfo接口来实现数据验证。 IDataErrorInfo接口定义了两个属性:Error和Item,以及Validate方法。Error属性用于存储验证过程中的错误信息,Item属性用于获取或设置正在验证的对象。Validate方法用于执行数据验证逻辑,并返回验证结果。我们可以在ViewModel中实现IDataErrorInfo接口,并在XAML中绑定相应的属性,从而实现对用户输入数据的验证。 首先,在ViewModel中实现IDataErrorInfo接口,需要实现Error、Item以及Validate方法。我们可以在这些方法中编写数据验证的逻辑,例如检查输入的数据是否为空、是否符合特定的格式要求等。 然后,在XAML中,我们可以使用Binding表达式来将用户界面中的控件与ViewModel中的属性进行绑定,同时使用ValidatesOnDataErrors属性来启用数据验证。当用户输入数据时,数据将会被自动验证,并根据验证结果进行相应的显示。 在XAML中使用IDataErrorInfo的一个示例是文本框的输入验证。我们可以在ViewModel中定义一个属性,并在XAML中将文本框的Text属性与之进行绑定。然后,在ViewModel中实现IDataErrorInfo接口的方法,例如在Validate方法中检查文本框的输入是否为数字。如果输入不是数字,我们可以将Error属性设置为相应的错误信息,然后在XAML中使用Validation.ErrorTemplate来设置错误信息的显示方式。 总而言之,XAML可以与IDataErrorInfo接口一起使用来实现数据验证的功能。通过在ViewModel中实现IDataErrorInfo接口的方法,并在XAML中进行相应的绑定和配置,我们可以轻松地实现对用户输入数据的验证,并提供相应的错误信息提示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值