zoukankan      html  css  js  c++  java
  • (转)Silverlight4 Data Validation

    原文地址:http://www.cnblogs.com/PerfectSoft/archive/2012/02/26/2369118.html

    数据有效性验证时非常的重要,对于所有的应用程序而言,都是必不可少的。在将用户输入的数据进行保存之前,务必对其进行有效性验证,确保所有相关数据有效后,方可保存。

       
    在Silverlight中,默认情况下,Silverlight不会对用户输入的无效数据给出友好的提示,以帮助用户输入正确的数据。幸运的是,Silverlight提供了进行数据有效性验证的特性,只需做一些额外的处理即可。


        没有任何数据有效性验证的数据类:


        //没有任何数据有效性验证
    public class Student
    {
    private string name;
    private int age;

    public string Name
    {
    get { return name; }
    set { name = value; } //未进行有效性验证,可能为空Null、空白字符......
    }

    public int Age
    {
    get { return age; }
    set { age = value; } //未进行有效性验证,可能小于0或大于100等.........
    }
    }


        MainPage XAML:


    <Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100" />
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <TextBlock Text="姓名:" HorizontalAlignment="Right"></TextBlock>

    <TextBox x:Name="NameTxt" Text="{Binding Name, Mode=TwoWay, TargetNullValue='姓名不能为空', FallbackValue='N/A'}"
    Width="300" HorizontalAlignment="Left" Grid.Column="1"></TextBox>

    <TextBlock Text="年龄:" HorizontalAlignment="Right" Grid.Row="1"></TextBlock>

    <TextBox x:Name="AgeTxt" Text="{Binding Age, Mode=TwoWay, TargetNullValue='年龄不能小于1', FallbackValue='N/A'}"
    Width="300" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left"></TextBox>

    <Button x:Name="Submit" Content="Submit" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" Width="100"></Button>
    </Grid>


        MainPage Code:



        此时运行Application,结果如下:



       在年龄文本框中输入"abc“:




    • ValidationOnException

       
    ValidationOnException = True,这将使Silverlight提供一个可视化的反馈信息当一个无效信息存在,这个属性将告诉Silverlight数据绑定引擎进行数据有效性验证,在进行数据对象赋值时。


        在进行验证时,有以下几点需要注意:



    • DataBinding must be TwoWay
    • ValidationOnException = True
    • 当目标对象失去焦点时,目标属性值更新至源属性

        带有数据有效性验证的数据类:


        //带有数据有效性验证
    public class Student
    {
    private string name;
    private int age;

    public string Name
    {
    get { return name; }
    set { name = value; }
    }

    public int Age
    {
    get { return age; }
    set
    {
    //进行数据有效性验证
    if (age < 0 || age > 100)
    {
    throw new Exception("年龄不能小于0或大于100");
    }
    age = value;
    }
    }
    }


        MainPage XAML:


    <Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100" />
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
    <RowDefinition Height="50" />
    <RowDefinition Height="50" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <TextBlock Text="姓名:" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>

    <TextBox x:Name="NameTxt" Text="{Binding Name, Mode=TwoWay, ValidatesOnExceptions=True, TargetNullValue='姓名不能为空', FallbackValue='N/A'}"
    Width="300" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="1"></TextBox>

    <TextBlock Text="年龄:" HorizontalAlignment="Right" Grid.Row="1" VerticalAlignment="Center"></TextBlock>

    <TextBox x:Name="AgeTxt" Text="{Binding Age, Mode=TwoWay,ValidatesOnExceptions=True, TargetNullValue='年龄不能小于1', FallbackValue='N/A'}"
    Width="300" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBox>

    <Button x:Name="Submit" Content="Submit" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" Width="100"></Button>
    </Grid>


        运行Application,在年龄文本框中输入abc:



       输入200:




    • The BindingValidationFailed Event

        NotifyOnValidationError =
    True,这使Silverlight
    数据绑定引擎激发BindingValidationFailed当在数据绑定过程中发生异常时,BindingValidationFailed事件是一个冒泡事件,所以此事件最好是在所有表单元素的第一个共同父元素上绑定。所以在此示例中最好是在Grid元素上激发BindingValidationFailed事件。


        MainPage XAML:


    <Grid x:Name="LayoutRoot" Background="White" BindingValidationError="LayoutRoot_BindingValidationError">
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100" />
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
    <RowDefinition Height="50" />
    <RowDefinition Height="50" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <TextBlock Text="姓名:" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>

    <TextBox x:Name="NameTxt" Text="{Binding Name, Mode=TwoWay, ValidatesOnExceptions=True,NotifyOnValidationError=True, TargetNullValue='姓名不能为空', FallbackValue='N/A'}"
    Width="300" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="1"></TextBox>

    <TextBlock Text="年龄:" HorizontalAlignment="Right" Grid.Row="1" VerticalAlignment="Center"></TextBlock>

    <TextBox x:Name="AgeTxt" Text="{Binding Age, Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True, TargetNullValue='年龄不能小于1', FallbackValue='N/A'}"
    Width="300" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBox>

    <Button x:Name="Submit" Content="Submit" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" Width="100"></Button>
    </Grid>


        BindingValidateOnError Event:



        其实去呈现异常信息,还可以采用ValidationSummary控件,与Asp.net中的类似。



    • UpdateSourceTrigger

       
    UpdateSourceTrigger取值为:Defualt[默认值]、Explicit,当UpdateSourceTrigger =
    Explicit时,必须手动更新源属性的值。


     <TextBox x:Name="NameTxt" Text="{Binding Name, Mode=TwoWay, ValidatesOnExceptions=True,NotifyOnValidationError=True,UpdateSourceTrigger=Explicit, TargetNullValue='姓名不能为空', FallbackValue='N/A'}"
    Width="300" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="1"></TextBox>
    <TextBox x:Name="AgeTxt" Text="{Binding Age, Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True, UpdateSourceTrigger=Explicit, TargetNullValue='年龄不能小于1', FallbackValue='N/A'}"
    Width="300" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBox>


       现在,手动进行源属性的更新,通过点击Submit按钮:


            private void Submit_Click(object sender, RoutedEventArgs e)
    {
    TextBox tempBox = null;

    foreach (var control in LayoutRoot.Children)
    {
    tempBox = control as TextBox;
    if (tempBox != null)
    {
    tempBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }
    }
    }


        在进行项目开发的时候,如果在WebService中的数据类执行有效性验证,在客户端一直没有验证成功过,且会抛出异常,针对这个问题各位有什么好的解决方案,请告诉我下,服务端数据类如下所示:


        [DataContract()]
    public class Student : INotifyPropertyChanged
    {
    private string name;
    private int age;

    //实现INotifyPropertyChanged接口
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
    if (PropertyChanged != null)
    {
    PropertyChanged(this, e);
    }
    }

    [DataMember()]
    public string Name
    {
    get
    {
    return name;
    }
    set
    {
    name = value;
    }
    }

    [DataMember()]
    public int Age
    {
    get
    {
    return age;
    }
    set
    {
    //有效性验证从未成功过
    if (age < 0 || age > 100)
    {
    throw new Exception("年龄不能小于0或大于100");
    }
    age = value;
    }
    }
    }


    如果解决???



  • 相关阅读:
    linux 命令展示该目录下的所有子目录及文件结构 tree
    ssh-keygen
    centos安装git
    spring-boot parent变更为依赖方式
    centos docker compose安装
    UML——活动图
    UML——构件图
    UML——部署图
    UML——用例图
    UML——关系
  • 原文地址:https://www.cnblogs.com/fcsh820/p/2373180.html
Copyright © 2011-2022 走看看