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}}" 
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);
            }
        }

这样就可以了。。

执行后的效果是

原文地址:https://www.cnblogs.com/lihaozhou/p/2629667.html