silverlight数据验证
silverlight的数据验证有几种方式,现在我学习了2种方式,下面是自己的一点实际操作,但是会很详细地列出来,希望给各位同是silverlight新手的人们一点思路
(1)新建验证类
我们新建项目“validation2demo”
1.在mainpage.xaml下建一个textblock 和一个textbox
2.在validation2demo项目下新建一个User.cs 的类
代码如下,里面有一些注释,我也还没有深入理解
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.ComponentModel; using System.ComponentModel.DataAnnotations; namespace validation2demo { //INotifyPropertyChanged在System.ComponentModel;命名空间下 //INotifyPropertyChanged只是.net自己提供的一个用于通知数据变更的接口 public class User:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; //当你在类里调用PropertyChange()的时候,外面的函数就可以响应了 public string _name; [Required(ErrorMessage= "必填选项" )] [StringLength(6,ErrorMessage= "用户名不能超过6个字符" )] public string Name { get { return _name; } set { Validator.ValidateProperty(value, new ValidationContext( this , null , null ) { MemberName = "Name" }); _name = value; if (PropertyChanged != null ) { PropertyChanged( this , new PropertyChangedEventArgs( "Name" )); } } } public void NotifyPropertyChanged(String propertyName) { if (PropertyChanged != null ) { PropertyChanged( this , new PropertyChangedEventArgs(propertyName)); } } } } |
这样就限制Name不能为空还有字符长度不能超过6
然后我们在设置xaml里面的属性
1 把命名空间添加进来,因为要用到User.cs
xmlns:local="clr-namespace:validation2demo"
2 在usercontrol里面写上
<UserControl.Resources> <local:User x:Key= "UserDataContext" /> </UserControl.Resources> |
3 再设置textbox和textblock的属性
<Grid x:Name= "LayoutRoot" Background= "White" BindingValidationError= "LayoutRoot_BindingValidationError" > <StackPanel Orientation= "Horizontal" > <TextBlock Text= "用户名:" VerticalAlignment= "Center" /> <TextBox x:Name= "txtUserName" Width= "200" Height= "50" DataContext= "{Binding Source={StaticResource UserDataContext}}" <br>Text= "{Binding Path=Name, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}" /> </StackPanel> |
4 在xaml.cs里面添加
private void LayoutRoot_BindingValidationError( object sender, ValidationErrorEventArgs e) { if (e.Action==ValidationErrorEventAction.Added) { (e.OriginalSource as Control).Background = new SolidColorBrush(Colors.Yellow); } if (e.Action == ValidationErrorEventAction.Removed) { (e.OriginalSource as Control).Background = new SolidColorBrush(Colors.White); } } |
5 执行之前 Ctrl+Alt + E 弹出这样的对话框
查找到System.Exception,把钩钩去掉,再执行程序
这样就行了,执行的效果是
(2)现在我来介绍另外一种验证方法,这种方式适合修改数据的数据验证
这种方法利用到wcf ria ,首先我们要把数据源添加进程序,让数据源暴露出来,我在前面有说过ria连接数据库的方法,大家可以看前面的
流程:
(1)ria添加数据源
(2)在后台加载实体
代码如下
public partial class MainPage : UserControl { DomainService1 ds; public MainPage() { ds = new DomainService1(); InitializeComponent(); ds.Load(ds.GetTestQuery(), Load =>{ Load.Completed += delegate { LayoutRoot.DataContext = Load.Entities.FirstOrDefault(); }; }, null ); |
利用LayoutRoot.DataContext = Load.Entities.FirstOrDefault();
你可以得到数据表里面的第一条数据,
你也可以自己写函数过滤要加载的实体
在前台
<Canvas x:Name= "LayoutRoot" Background= "White" > <StackPanel> <StackPanel Orientation= "Horizontal" > <TextBlock Canvas.Left= "205" Canvas.Top= "39" Height= "23" Name= "textBlock1" Text= "用户名" Margin= "10" /> <TextBox Canvas.Left= "54" Canvas.Top= "36" Height= "23" Name= "textBox1" Text="{Binding NotifyOnValidationError=True, Path=UserName, ValidatesOnExceptions=True, Mode=TwoWay, ValidatesOnNotifyDataErrors=True} " Width=" 120" /> </StackPanel> <StackPanel Orientation= "Horizontal" > <TextBlock Canvas.Left= "205" Canvas.Top= "39" Height= "23" Name= "textBlock2" Text= "密 码" Margin= "10" /> <TextBox Canvas.Left= "54" Canvas.Top= "36" Height= "23" Name= "textBox2" Text="{Binding NotifyOnValidationError=True, Path=PassWord, ValidatesOnExceptions=True, Mode=TwoWay, ValidatesOnNotifyDataErrors=True} " Width=" 120" /> </StackPanel> <StackPanel Orientation= "Horizontal" > <Button Name= "submit_click" Content= "修改" Width= "50" Height= "30" Margin= "10" Click= "submitt_click" /> </StackPanel> </StackPanel> </Canvas> |
运行的时候,会有数据自动加载到textbox里面,你修改数据的时候会验证数据
现在我们去写验证数据的代码
在metadata.cs里面,我们修改数据为
public partial class Test { // 通过此类可将自定义特性附加到 //Test 类的属性。 // // 例如,下面的代码将 Xyz 属性标记为 //必需属性并指定有效值的格式: // [Required] // [RegularExpression("[A-Z][A-Za-z0-9]*")] // [StringLength(32)] // public string Xyz { get; set; } internal sealed class TestMetadata { // 元数据类不会实例化。 private TestMetadata() { } [Required(ErrorMessage= "必填选项" )] //不能为空 [StringLength(6,ErrorMessage= "密码长度不能超过6" )] //密码长度不能超过6 public string PassWord { get ; set ; } [Required(ErrorMessage= "必填选项" )] //不能为空 public string UserName { get ; set ; } } } } |
后台
void LayoutRoot_BindingValidationError( object sender, ValidationErrorEventArgs e) { if (e.Action == ValidationErrorEventAction.Added) { (e.OriginalSource as Control).Background = new SolidColorBrush(Colors.Yellow); } if (e.Action == ValidationErrorEventAction.Removed) { (e.OriginalSource as Control).Background = new SolidColorBrush(Colors.White); } } |
这样就可以了。。
执行后的效果是
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步