(转)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;
}
}
}


如果解决???



原文地址:https://www.cnblogs.com/fcsh820/p/2373180.html