【IT168 技术文档】在Silverlight3中对数据进行校验不再像Silverlight2中那样麻烦了,下面就简要演示一下。
首先,我们创建一个Silverlight3应用,名为:"ValidateSample"
然后将下面的xaml代码复制到"MainPage.xaml"中:
<Grid x:Name="LayoutRoot" Background="AliceBlue">
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="50" />
<RowDefinition Height="150" />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="300"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="地址:" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>
<TextBox Margin="5" Name="Address" VerticalAlignment="Center" Width="192" Grid.Row="0" Grid.Column="1"
Text="{Binding Address,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}"/>
<TextBlock Text="标题:" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>
<StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right">
<TextBox Margin="5" Name="Title" VerticalAlignment="Center" Grid.Row="1" Grid.Column="1" Width="160"
Text="{Binding Title,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" />
<ComboBox Name="EmailFormat" Width="80" Height="20" SelectedIndex="{Binding Format,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}">
<ComboBoxItem Content="邮件格式"></ComboBoxItem>
<ComboBoxItem Content="Html"></ComboBoxItem>
<ComboBoxItem Content="Text"></ComboBoxItem>
</ComboBox>
</StackPanel>
<TextBlock Text="内容:" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>
<TextBox Margin="5" Name="Body" Grid.Row="2" Grid.Column="1" Width="230" Height="130"
Text="{Binding Body,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" />
<Button Grid.Row="3" Grid.Column="1" Content=" 提 交 " Width="100" Height="30" FontSize="16"/>
<!--Click="OnSubmit"-->
</Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="50" />
<RowDefinition Height="150" />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="300"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="地址:" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>
<TextBox Margin="5" Name="Address" VerticalAlignment="Center" Width="192" Grid.Row="0" Grid.Column="1"
Text="{Binding Address,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}"/>
<TextBlock Text="标题:" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>
<StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right">
<TextBox Margin="5" Name="Title" VerticalAlignment="Center" Grid.Row="1" Grid.Column="1" Width="160"
Text="{Binding Title,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" />
<ComboBox Name="EmailFormat" Width="80" Height="20" SelectedIndex="{Binding Format,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}">
<ComboBoxItem Content="邮件格式"></ComboBoxItem>
<ComboBoxItem Content="Html"></ComboBoxItem>
<ComboBoxItem Content="Text"></ComboBoxItem>
</ComboBox>
</StackPanel>
<TextBlock Text="内容:" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>
<TextBox Margin="5" Name="Body" Grid.Row="2" Grid.Column="1" Width="230" Height="130"
Text="{Binding Body,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" />
<Button Grid.Row="3" Grid.Column="1" Content=" 提 交 " Width="100" Height="30" FontSize="16"/>
<!--Click="OnSubmit"-->
</Grid>
然后就是相应的校验信息类,本示例使用Email校验,相应的CS代码:
public class EmailInfo
{
string address;
string title;
string body;
int format;
public EmailInfo(string address, string title, string body, int format)
{
this.address = address;
this.title = title;
this.body = body;
this.format = format;
}
public string Address
{
get { return address; }
set
{
CheckFieldLength(value, 1, 100);
if (!System.Text.RegularExpressions.Regex.IsMatch(value, @"^[\w\.]+@[A-Za-z0-9-_]+[\.][A-Za-z0-9-_]"))
throw new Exception("邮件格式无效!");
address = value;
}
}
public string Title
{
get { return title; }
set
{
CheckFieldLength(value, 1, 100);
title = value;
}
}
void CheckFieldLength(string value, int min, int max)
{
if ((value.Length < min) || (value.Length > max))
throw new Exception("内容长度应在: " + min + " 至 " + max);
}
public string Body
{
get { return body; }
set
{
CheckFieldLength(value, 1, 100);
body = value;
}
}
public int Format
{
get { return format; }
set
{
if (value == 0)
throw new Exception("请选择相应的邮件格式!");
format = value;
}
}
}
{
string address;
string title;
string body;
int format;
public EmailInfo(string address, string title, string body, int format)
{
this.address = address;
this.title = title;
this.body = body;
this.format = format;
}
public string Address
{
get { return address; }
set
{
CheckFieldLength(value, 1, 100);
if (!System.Text.RegularExpressions.Regex.IsMatch(value, @"^[\w\.]+@[A-Za-z0-9-_]+[\.][A-Za-z0-9-_]"))
throw new Exception("邮件格式无效!");
address = value;
}
}
public string Title
{
get { return title; }
set
{
CheckFieldLength(value, 1, 100);
title = value;
}
}
void CheckFieldLength(string value, int min, int max)
{
if ((value.Length < min) || (value.Length > max))
throw new Exception("内容长度应在: " + min + " 至 " + max);
}
public string Body
{
get { return body; }
set
{
CheckFieldLength(value, 1, 100);
body = value;
}
}
public int Format
{
get { return format; }
set
{
if (value == 0)
throw new Exception("请选择相应的邮件格式!");
format = value;
}
}
}
然后,我们只要在MainPage.xaml.cs文件中添加如下代码:
public MainPage()
{
InitializeComponent();
this.Loaded += OnLoaded;
}
void OnLoaded(object sender, RoutedEventArgs e)
{
this.DataContext = new EmailInfo("daizhj617595@126.com", "你好!", "这是邮件内容", 1);
}
{
InitializeComponent();
this.Loaded += OnLoaded;
}
void OnLoaded(object sender, RoutedEventArgs e)
{
this.DataContext = new EmailInfo("daizhj617595@126.com", "你好!", "这是邮件内容", 1);
}
接着,运行一下代码:
另外,如果想要收集错误信息,以便统一进行显示的话,可以使用“OnValidationError”事件,如下:
public ObservableCollection<ValidationError> Errors { get; set; }
public MainPage()
{
InitializeComponent();
this.Errors = new ObservableCollection<ValidationError>();
this.Loaded += OnLoaded;
}
void OnLoaded(object sender, RoutedEventArgs e)
{
this.DataContext = new EmailInfo("daizhj617595@126.com", "你好!", "这是邮件内容", 1);
}
private void OnValidationError(object sender, ValidationErrorEventArgs e)
{
if(e.Action == ValidationErrorEventAction.Added)
Errors.Add(e.Error);
else if (e.Action == ValidationErrorEventAction.Removed)
Errors.Remove(e.Error);
}
public MainPage()
{
InitializeComponent();
this.Errors = new ObservableCollection<ValidationError>();
this.Loaded += OnLoaded;
}
void OnLoaded(object sender, RoutedEventArgs e)
{
this.DataContext = new EmailInfo("daizhj617595@126.com", "你好!", "这是邮件内容", 1);
}
private void OnValidationError(object sender, ValidationErrorEventArgs e)
{
if(e.Action == ValidationErrorEventAction.Added)
Errors.Add(e.Error);
else if (e.Action == ValidationErrorEventAction.Removed)
Errors.Remove(e.Error);
}
这样错误信息就被添加到Errors集合中了。
另外还可以通过“点击提交按钮”方式来统一进行收集,下面是一个Button的Click事件代码:
void OnSubmit(object sender, RoutedEventArgs args)
{
List<ValidationError> errors = new List<ValidationError>();
foreach (UIElement ui in LayoutRoot.Children)
{
FrameworkElement fe = ui as FrameworkElement;
if (fe != null)
{
foreach (ValidationError ve in Validation.GetErrors(fe))
{
errors.Add(ve);
}
}
}
}
{
List<ValidationError> errors = new List<ValidationError>();
foreach (UIElement ui in LayoutRoot.Children)
{
FrameworkElement fe = ui as FrameworkElement;
if (fe != null)
{
foreach (ValidationError ve in Validation.GetErrors(fe))
{
errors.Add(ve);
}
}
}
}