SilverLight4.0数据验证IDataErrorInfo, INotifyDataErrorInfo[转]
生活随笔
收集整理的這篇文章主要介紹了
SilverLight4.0数据验证IDataErrorInfo, INotifyDataErrorInfo[转]
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原文地址:http://www.cnblogs.com/webabcd/archive/2010/09/09/1821911.html
介紹
Silverlight 4.0?數(shù)據(jù)驗(yàn)證:
- IDataErrorInfo - 對(duì)數(shù)據(jù)實(shí)體類提供自定義驗(yàn)證支持。.NET Framework 也有此接口,可以方便移植?
- INotifyDataErrorInfo - 對(duì)數(shù)據(jù)實(shí)體類提供自定義驗(yàn)證支持,比 IDataErrorInfo 功能更強(qiáng)大。INotifyDataErrorInfo 支持異步驗(yàn)證,這就意味著其可以通過驗(yàn)證方法調(diào)用 Web 服務(wù)和用回調(diào)方法更新錯(cuò)誤集合來添加服務(wù)器端驗(yàn)證?
?
示例
1、演示 IDataErrorInfo?的應(yīng)用
IDataErrorInfoModel.cs
?*?IDataErrorInfo?-?對(duì)數(shù)據(jù)實(shí)體類提供自定義驗(yàn)證支持。.NET?Framework?也有此接口,可以方便移植
?*?????string?Error?-?獲取對(duì)象的驗(yàn)證錯(cuò)誤信息
?*?????string?this[string?columnName]?-?獲取對(duì)象的指定字段的驗(yàn)證錯(cuò)誤信息
?*/
using?System;
using?System.Net;
using?System.Windows;
using?System.Windows.Controls;
using?System.Windows.Documents;
using?System.Windows.Ink;
using?System.Windows.Input;
using?System.Windows.Media;
using?System.Windows.Media.Animation;
using?System.Windows.Shapes;
using?System.Collections.Generic;
using?System.ComponentModel.DataAnnotations;
namespace?Silverlight40.Binding
{
????public?class?IDataErrorInfoModel?:?System.ComponentModel.IDataErrorInfo
????{
????????//?驗(yàn)證錯(cuò)誤的提示信息
????????private?const?string?ID_ERROR?=?"id?不能小于?10";
????????private?const?string?NAME_ERROR?=?"name?不能包含空格";
????????private?const?string?NAME_WARNING?=?"name?不能小于?5?個(gè)字符";
????????//?用于保存驗(yàn)證錯(cuò)誤信息。key?保存所驗(yàn)證的字段名稱;value?保存對(duì)應(yīng)的字段的驗(yàn)證錯(cuò)誤信息列表
????????private?Dictionary<String,?List<String>>?errors?=?new?Dictionary<string,?List<string>>();
????????private?int?_id;
????????[Display(Name?=?"標(biāo)識(shí)")]
????????public?int?Id
????????{
????????????get?{?return?_id;?}
????????????set?
????????????{
????????????????if?(value?>?1000)
????????????????????throw?new?Exception("太大了");
????????????????if?(IsIdValid(value)?&&?_id?!=?value)?
????????????????????_id?=?value;?
????????????}
????????}
????????private?string?_name;
????????[Display(Name?=?"名稱")]
????????public?string?Name
????????{
????????????get?{?return?_name;?}
????????????set?
????????????{?
????????????????if?(IsNameValid(value)?&&?_name?!=?value)?
????????????????????_name?=?value;?
????????????}
????????}
????????public?bool?IsIdValid(int?value)
????????{
????????????bool?isValid?=?true;
????????????if?(value?<?10)
????????????{
????????????????AddError("Id",?ID_ERROR);
????????????????isValid?=?false;
????????????}
????????????else
????????????{
????????????????RemoveError("Id",?ID_ERROR);
????????????}
????????????return?isValid;
????????}
????????public?bool?IsNameValid(string?value)
????????{
????????????bool?isValid?=?true;
????????????if?(value.Contains("?"))
????????????{
????????????????AddError("Name",?NAME_ERROR);
????????????????isValid?=?false;
????????????}
????????????else
????????????{
????????????????RemoveError("Name",?NAME_ERROR);
????????????}
????????????if?(value.Length?<?5)
????????????{
????????????????AddError("Name",?NAME_WARNING);
????????????????isValid?=?false;
????????????}
????????????else
????????????{
????????????????RemoveError("Name",?NAME_WARNING);
????????????}
????????????return?isValid;
????????}
??????
????????public?void?AddError(string?propertyName,?string?error)
????????{
????????????if?(!errors.ContainsKey(propertyName))
????????????????errors[propertyName]?=?new?List<string>();
????????????if?(!errors[propertyName].Contains(error))
????????????????errors[propertyName].Add(error);
????????}
????????public?void?RemoveError(string?propertyName,?string?error)
????????{
????????????if?(errors.ContainsKey(propertyName)?&&?errors[propertyName].Contains(error))
????????????{
????????????????errors[propertyName].Remove(error);
????????????????if?(errors[propertyName].Count?==?0)?
????????????????????errors.Remove(propertyName);
????????????}
????????}
????????public?string?Error
????????{
????????????get?{?return?errors.Count?>?0???"有驗(yàn)證錯(cuò)誤"?:?"沒有驗(yàn)證錯(cuò)誤";?}
????????}
????????public?string?this[string?propertyName]
????????{
????????????get?
????????????{
????????????????if?(errors.ContainsKey(propertyName))
????????????????????return?string.Join(Environment.NewLine,?errors[propertyName]);
????????????????else
????????????????????return?null;
????????????}
????????}
????}
}
IDataErrorInfo.xaml
<navigation:Page?x:Class="Silverlight40.Binding.IDataErrorInfo"????????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"?
???????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"?
???????????xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
???????????xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
???????????xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
???????????xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
???????????Title="IDataErrorInfo?Page">
????<Grid?x:Name="LayoutRoot">
????????<StackPanel?HorizontalAlignment="Left">
????????????<sdk:ValidationSummary?Margin="3">
????????????????<sdk:ValidationSummary.Header>
????????????????????錯(cuò)誤列表:
????????????????</sdk:ValidationSummary.Header>
????????????</sdk:ValidationSummary>
????????????<!--
????????????????ValidatesOnExceptions?-?指定綁定引擎是否報(bào)告驗(yàn)證過程中的異常信息
????????????????ValidatesOnDataErrors?-?指定綁定引擎是否報(bào)告綁定數(shù)據(jù)實(shí)體上的?IDataErrorInfo?所實(shí)現(xiàn)的驗(yàn)證錯(cuò)誤信息(通過?IDataErrorInfo?的?this[string?columnName]?獲取驗(yàn)證錯(cuò)誤信息)
????????????????NotifyOnValidationError?-?當(dāng)出現(xiàn)驗(yàn)證錯(cuò)誤時(shí)是否觸發(fā)?BindingValidationError?事件
????????????-->
????????????<StackPanel?Orientation="Horizontal">
????????????????<sdk:Label?Target="{Binding?ElementName=txtId}"?/>
????????????????<TextBox?Name="txtId"?Text="{Binding?Id,?Mode=TwoWay,?ValidatesOnExceptions=True,?ValidatesOnDataErrors=True,?NotifyOnValidationError=True}"?KeyDown="txtId_KeyDown"/>
????????????????<sdk:DescriptionViewer?Description="id?不能小于?10"/>
????????????</StackPanel>
????????????<StackPanel?Orientation="Horizontal">
????????????????<sdk:Label?Target="{Binding?ElementName=txtName}"/>
????????????????<TextBox?Name="txtName"?Text="{Binding?Name,?Mode=TwoWay,?ValidatesOnExceptions=True,?ValidatesOnDataErrors=True,?NotifyOnValidationError=True}"?KeyDown="txtName_KeyDown"/>
????????????????<sdk:DescriptionViewer?Description="name?不能包含空格且?name?不能小于?5?個(gè)字符"/>
????????????</StackPanel>
????????????
????????????<Button?Name="btnSubmit"?Content="獲取驗(yàn)證信息"?Click="btnSubmit_Click"?/>
????????????
????????</StackPanel>
????</Grid>
</navigation:Page>
IDataErrorInfo.xaml.cs
/*?*?通過綁定實(shí)現(xiàn)了?IDataErrorInfo?接口的實(shí)體類來實(shí)現(xiàn)自定義數(shù)據(jù)驗(yàn)證功能
?*/
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Net;
using?System.Windows;
using?System.Windows.Controls;
using?System.Windows.Documents;
using?System.Windows.Input;
using?System.Windows.Media;
using?System.Windows.Media.Animation;
using?System.Windows.Shapes;
using?System.Windows.Navigation;
namespace?Silverlight40.Binding
{
????public?partial?class?IDataErrorInfo?:?Page
????{
????????IDataErrorInfoModel?_model;
????????public?IDataErrorInfo()
????????{
????????????InitializeComponent();
????????}
????????protected?override?void?OnNavigatedTo(NavigationEventArgs?e)
????????{
????????????_model?=?new?IDataErrorInfoModel()?{?Id?=?100,?Name?=?"webabcd"?};
????????????LayoutRoot.DataContext?=?_model;
????????????//?BindingValidationError?-?當(dāng)有數(shù)據(jù)驗(yàn)證錯(cuò)誤時(shí)所觸發(fā)的事件。綁定時(shí)需要設(shè)置?NotifyOnValidationError=True
????????????txtId.BindingValidationError?+=?(x,?y)?=>?{?MessageBox.Show(y.Error.ErrorContent.ToString());?};
????????????txtName.BindingValidationError?+=?(x,?y)?=>?{?MessageBox.Show(y.Error.ErrorContent.ToString());?};
????????}
????????private?void?txtId_KeyDown(object?sender,?KeyEventArgs?e)
????????{
????????????//?注:
????????????//?BindingValidationError?事件只有在控件失去焦點(diǎn)才會(huì)被觸發(fā)
????????????//?如果需要在控件沒失去焦點(diǎn)的情況下產(chǎn)生驗(yàn)證效果,那么可以通過調(diào)用?BindingExpression.UpdateSource()?方法來實(shí)現(xiàn)
????????????//?FrameworkElement.GetBindingExpression(DependencyProperty?dp)?-?獲取?FrameworkElement?的指定屬性上的綁定信息
????????????//?BindingExpression.UpdateSource()?-?將當(dāng)前綁定信息立即發(fā)送到綁定方式為?TwoWay?的屬性上
????????????if?(e.Key?==?System.Windows.Input.Key.Enter)
????????????????txtId.GetBindingExpression(TextBox.TextProperty).UpdateSource();
????????}
????????private?void?txtName_KeyDown(object?sender,?KeyEventArgs?e)
????????{
????????????if?(e.Key?==?System.Windows.Input.Key.Enter)
????????????????txtName.GetBindingExpression(TextBox.TextProperty).UpdateSource();
????????}
????????private?void?btnSubmit_Click(object?sender,?RoutedEventArgs?e)
????????{
????????????MessageBox.Show("驗(yàn)證信息:"?+?_model.Error);
????????}
????}
}
?
2、演示 INotifyDataErrorInfo 的應(yīng)用
INotifyDataErrorInfoModel.cs
?*?INotifyDataErrorInfo?-?對(duì)數(shù)據(jù)實(shí)體類提供自定義驗(yàn)證支持,比?IDataErrorInfo?功能更強(qiáng)大。INotifyDataErrorInfo?支持異步驗(yàn)證,這就意味著其可以通過驗(yàn)證方法調(diào)用?Web?服務(wù)和用回調(diào)方法更新錯(cuò)誤集合來添加服務(wù)器端驗(yàn)證
?*?????bool?HasErrors?-?對(duì)象是否有驗(yàn)證錯(cuò)誤信息
?*?????event?EventHandler<DataErrorsChangedEventArgs>?ErrorsChanged?-?當(dāng)對(duì)象的驗(yàn)證錯(cuò)誤信息發(fā)生改變時(shí)所觸發(fā)的事件
?*?????IEnumerable?GetErrors(string?propertyName)?-?獲取對(duì)象的指定字段的驗(yàn)證錯(cuò)誤信息
?*/
using?System;
using?System.Net;
using?System.Windows;
using?System.Windows.Controls;
using?System.Windows.Documents;
using?System.Windows.Ink;
using?System.Windows.Input;
using?System.Windows.Media;
using?System.Windows.Media.Animation;
using?System.Windows.Shapes;
using?System.Collections.Generic;
using?System.ComponentModel.DataAnnotations;
using?System.ComponentModel;
namespace?Silverlight40.Binding
{
????public?class?INotifyDataErrorInfoModel?:?System.ComponentModel.INotifyDataErrorInfo
????{
????????//?驗(yàn)證錯(cuò)誤的提示信息
????????private?const?string?ID_ERROR?=?"id?不能小于?10";
????????private?const?string?NAME_ERROR?=?"name?不能包含空格";
????????private?const?string?NAME_WARNING?=?"name?不能小于?5?個(gè)字符";
????????//?用于保存驗(yàn)證錯(cuò)誤信息。key?保存所驗(yàn)證的字段名稱;value?保存對(duì)應(yīng)的字段的驗(yàn)證錯(cuò)誤信息列表
????????private?Dictionary<String,?List<String>>?errors?=?new?Dictionary<string,?List<string>>();
????????private?int?_id;
????????[Display(Name?=?"標(biāo)識(shí)")]
????????public?int?Id
????????{
????????????get?{?return?_id;?}
????????????set
????????????{
????????????????if?(value?>?1000)
????????????????????throw?new?Exception("太大了");
????????????????if?(IsIdValid(value)?&&?_id?!=?value)
????????????????????_id?=?value;
????????????}
????????}
????????private?string?_name;
????????[Display(Name?=?"名稱")]
????????public?string?Name
????????{
????????????get?{?return?_name;?}
????????????set
????????????{
????????????????if?(IsNameValid(value)?&&?_name?!=?value)
????????????????????_name?=?value;
????????????}
????????}
????????public?bool?IsIdValid(int?value)
????????{
????????????bool?isValid?=?true;
????????????if?(value?<?10)
????????????{
????????????????AddError("Id",?ID_ERROR);
????????????????isValid?=?false;
????????????}
????????????else
????????????{
????????????????RemoveError("Id",?ID_ERROR);
????????????}
????????????return?isValid;
????????}
????????public?bool?IsNameValid(string?value)
????????{
????????????bool?isValid?=?true;
????????????if?(value.Contains("?"))
????????????{
????????????????AddError("Name",?NAME_ERROR);
????????????????isValid?=?false;
????????????}
????????????else
????????????{
????????????????RemoveError("Name",?NAME_ERROR);
????????????}
????????????if?(value.Length?<?5)
????????????{
????????????????AddError("Name",?NAME_WARNING);
????????????????isValid?=?false;
????????????}
????????????else
????????????{
????????????????RemoveError("Name",?NAME_WARNING);
????????????}
????????????return?isValid;
????????}
????????public?void?AddError(string?propertyName,?string?error)
????????{
????????????if?(!errors.ContainsKey(propertyName))
????????????????errors[propertyName]?=?new?List<string>();
????????????if?(!errors[propertyName].Contains(error))
????????????{
????????????????errors[propertyName].Add(error);
????????????????RaiseErrorsChanged(propertyName);
????????????}
????????}
????????public?void?RemoveError(string?propertyName,?string?error)
????????{
????????????if?(errors.ContainsKey(propertyName)?&&?errors[propertyName].Contains(error))
????????????{
????????????????errors[propertyName].Remove(error);
????????????????if?(errors[propertyName].Count?==?0)
????????????????????errors.Remove(propertyName);
????????????????RaiseErrorsChanged(propertyName);
????????????}
????????}
????????public?event?EventHandler<DataErrorsChangedEventArgs>?ErrorsChanged;
????????public?void?RaiseErrorsChanged(string?propertyName)
????????{
????????????if?(ErrorsChanged?!=?null)
????????????????ErrorsChanged(this,?new?DataErrorsChangedEventArgs(propertyName));
????????}
????????public?System.Collections.IEnumerable?GetErrors(string?propertyName)
????????{
????????????if?(errors.ContainsKey(propertyName))
????????????????return?errors[propertyName];
????????????else
????????????????return?null;
????????}
????????public?bool?HasErrors
????????{
????????????get?{?return?errors.Count?>?0;?}
????????}
????}
}
INotifyDataErrorInfo.xaml
<navigation:Page?x:Class="Silverlight40.Binding.INotifyDataErrorInfo"????????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"?
???????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"?
???????????xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
???????????xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
???????????xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
???????????xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
???????????Title="INotifyDataErrorInfo?Page">
????<Grid?x:Name="LayoutRoot">
????????<StackPanel?HorizontalAlignment="Left">
????????????<sdk:ValidationSummary?Margin="3">
????????????????<sdk:ValidationSummary.Header>
????????????????????錯(cuò)誤列表:
????????????????</sdk:ValidationSummary.Header>
????????????</sdk:ValidationSummary>
????????????<!--
????????????????ValidatesOnExceptions?-?指定綁定引擎是否報(bào)告驗(yàn)證過程中的異常信息
????????????????NotifyOnValidationError?-?當(dāng)出現(xiàn)驗(yàn)證錯(cuò)誤時(shí)是否觸發(fā)?BindingValidationError?事件
????????????-->
????????????<StackPanel?Orientation="Horizontal">
????????????????<sdk:Label?Target="{Binding?ElementName=txtId}"?/>
????????????????<TextBox?Name="txtId"?Text="{Binding?Id,?Mode=TwoWay,?ValidatesOnExceptions=True,?NotifyOnValidationError=True}"?KeyDown="txtId_KeyDown"/>
????????????????<sdk:DescriptionViewer?Description="id?不能小于?10"/>
????????????</StackPanel>
????????????<StackPanel?Orientation="Horizontal">
????????????????<sdk:Label?Target="{Binding?ElementName=txtName}"/>
????????????????<TextBox?Name="txtName"?Text="{Binding?Name,?Mode=TwoWay,?ValidatesOnExceptions=True,?NotifyOnValidationError=True}"?KeyDown="txtName_KeyDown"/>
????????????????<sdk:DescriptionViewer?Description="name?不能包含空格且?name?不能小于?5?個(gè)字符"/>
????????????</StackPanel>
????????????<Button?Name="btnSubmit"?Content="是否有驗(yàn)證錯(cuò)誤"?Click="btnSubmit_Click"?/>
????????</StackPanel>
????</Grid>
</navigation:Page>
INotifyDataErrorInfo.xaml.cs
/*?*?通過綁定實(shí)現(xiàn)了?INotifyDataErrorInfo?接口的實(shí)體類來實(shí)現(xiàn)自定義數(shù)據(jù)驗(yàn)證功能
?*/
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Net;
using?System.Windows;
using?System.Windows.Controls;
using?System.Windows.Documents;
using?System.Windows.Input;
using?System.Windows.Media;
using?System.Windows.Media.Animation;
using?System.Windows.Shapes;
using?System.Windows.Navigation;
namespace?Silverlight40.Binding
{
????public?partial?class?INotifyDataErrorInfo?:?Page
????{
????????INotifyDataErrorInfoModel?_model;
????????public?INotifyDataErrorInfo()
????????{
????????????InitializeComponent();
????????}
????????protected?override?void?OnNavigatedTo(NavigationEventArgs?e)
????????{
????????????_model?=?new?INotifyDataErrorInfoModel()?{?Id?=?100,?Name?=?"webabcd"?};
????????????LayoutRoot.DataContext?=?_model;
????????????//?BindingValidationError?-?當(dāng)有數(shù)據(jù)驗(yàn)證錯(cuò)誤時(shí)所觸發(fā)的事件。綁定時(shí)需要設(shè)置?NotifyOnValidationError=True
????????????txtId.BindingValidationError?+=?(x,?y)?=>?{?MessageBox.Show(y.Error.ErrorContent.ToString());?};
????????????txtName.BindingValidationError?+=?(x,?y)?=>?{?MessageBox.Show(y.Error.ErrorContent.ToString());?};
????????}
????????private?void?txtId_KeyDown(object?sender,?KeyEventArgs?e)
????????{
????????????//?注:
????????????//?BindingValidationError?事件只有在控件失去焦點(diǎn)才會(huì)被觸發(fā)
????????????//?如果需要在控件沒失去焦點(diǎn)的情況下產(chǎn)生驗(yàn)證效果,那么可以通過調(diào)用?BindingExpression.UpdateSource()?方法來實(shí)現(xiàn)
????????????//?FrameworkElement.GetBindingExpression(DependencyProperty?dp)?-?獲取?FrameworkElement?的指定屬性上的綁定信息
????????????//?BindingExpression.UpdateSource()?-?將當(dāng)前綁定信息立即發(fā)送到綁定方式為?TwoWay?的屬性上
????????????if?(e.Key?==?System.Windows.Input.Key.Enter)
????????????????txtId.GetBindingExpression(TextBox.TextProperty).UpdateSource();
????????}
????????private?void?txtName_KeyDown(object?sender,?KeyEventArgs?e)
????????{
????????????if?(e.Key?==?System.Windows.Input.Key.Enter)
????????????????txtName.GetBindingExpression(TextBox.TextProperty).UpdateSource();
????????}
????????private?void?btnSubmit_Click(object?sender,?RoutedEventArgs?e)
????????{
????????????MessageBox.Show("是否有驗(yàn)證錯(cuò)誤:"?+?_model.HasErrors.ToString());
????????}
????}
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/arongbest/archive/2011/10/08/2201875.html
總結(jié)
以上是生活随笔為你收集整理的SilverLight4.0数据验证IDataErrorInfo, INotifyDataErrorInfo[转]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sipp的使用
- 下一篇: 分析:合格的UTM设备评判与选择