zoukankan      html  css  js  c++  java
  • 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);
                }
            }
    

    这样就可以了。。

    执行后的效果是

  • 相关阅读:
    CREATE OPERATOR
    create_module
    一个LINUX狂人的语录(个人认为很精辟)
    jQuery 判断多个 input file 都不能为空
    Java实现 LeetCode 2 两数相加
    Java实现 LeetCode 2 两数相加
    Java实现 LeetCode 2 两数相加
    Java实现 蓝桥杯 算法提高 和谐宿舍2
    Java实现 蓝桥杯 算法提高 和谐宿舍2
    Java实现 蓝桥杯 算法提高 和谐宿舍2
  • 原文地址:https://www.cnblogs.com/lihaozhou/p/2629667.html
Copyright © 2011-2022 走看看