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}}"
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); } }
这样就可以了。。
执行后的效果是