Silverlight数据验证与表单构建全解析
立即解锁
发布时间: 2025-08-26 01:40:55 阅读量: 17 订阅数: 27 AIGC 

### Silverlight数据验证与表单构建全解析
在开发数据驱动的应用程序时,数据验证和表单构建是至关重要的环节。Silverlight提供了一系列强大的工具和功能,帮助开发者更高效地完成这些任务。本文将详细介绍Silverlight中的数据验证和表单构建相关知识,包括`ValidationSummary`控件、`DataField`和`DataForm`控件,以及数据注解的使用。
#### 1. ValidationSummary控件
Silverlight提供了多种方式来标记无效数据,例如输入控件外观改变、弹出错误消息、标签文本变红等。但在长表单中,显示一个错误列表来总结一组控件中的问题会更有用,`ValidationSummary`控件就可以实现这一功能。
##### 1.1 使用方法
`ValidationSummary`控件会监控一个容器中的错误事件。通常,你可以通过`Target`属性将其指向包含输入控件的`Grid`,如果不设置`Target`属性,它会自动监控其所在容器内的所有控件。示例代码如下:
```xml
<dataInput:ValidationSummary Grid.Row="6" Grid.ColumnSpan="3" Margin="7" />
```
##### 1.2 注意事项
要让`ValidationSummary`捕获错误,绑定必须将`Mode`设置为`TwoWay`,并将`ValidatesOnExceptions`和`NotifyOnValidationError`设置为`true`。
##### 1.3 控件行为
- 当没有错误时,`ValidationSummary`不可见且不占用空间。
- 当有一个或多个错误时,它会显示一个包含错误图标和错误数量的标题,以及一个详细列出违规属性和异常消息的错误列表。
- 用户点击错误消息时,`ValidationSummary`会触发`FocusingInvalidControl`事件,并将焦点转移到有问题的输入控件(除非将`FocusControlsOnClick`属性设置为`false`)。
##### 1.4 排除特定控件的错误
如果你想阻止某个控件的错误显示在`ValidationSummary`中,可以设置`ShowErrorsInSummary`属性,示例如下:
```xml
<TextBox Margin="5" x:Name="txtUnitCost" Width="100" HorizontalAlignment="Left"
dataInput:ValidationSummary.ShowErrorsInSummary="False"
Text="{Binding UnitCost, Mode=TwoWay, ValidatesOnExceptions=true,
NotifyOnValidationError=true}"></TextBox>
```
##### 1.5 自定义外观
`ValidationSummary`还提供了几个属性来定制其外观,例如`HeaderTemplate`、`Header`和`SummaryListBoxStyle`。你还可以通过`HasErrors`属性检查表单是否有效,通过`Errors`集合检查所有检测到的问题。
#### 2. DataField和DataForm控件
如果你使用Silverlight Toolkit,`DataField`和`DataForm`控件可以帮助你构建丰富的数据表单。
##### 2.1 DataField控件
`DataField`控件是一个一体化的控件,用于编辑单个绑定属性,它结合了`Label`控件、`DescriptionViewer`控件和一个输入控件(如`TextBox`)。
##### 2.2 DataForm控件
`DataForm`控件是一个容器,用于创建显示和编辑数据对象所需的所有绑定控件。使用方法如下:
- 显示单个数据对象:
```csharp
dataForm.CurrentItem = product;
```
- 显示一组数据对象:
```csharp
dataForm.ItemsSource = products;
```
如果使用`ItemsSource`属性绑定多个项目,`DataForm`会在表单顶部添加一个带有导航控件的栏,用户可以通过这些控件浏览记录、添加新记录和删除现有记录。不过,目前许多开发者仍倾向于手动创建数据表单标记,直到`DataForm`更加成熟。
#### 3. 数据注解
数据注解是Silverlight提供的一种解决方案,允许你通过在数据类的属性上附加一个或多个特性来应用验证规则,从而将数据验证从代码中分离出来,提高代码的清晰度和类的可维护性。
##### 3.1 准备工作
在使用数据注解之前,需要添加对`System.ComponentModel.DataAnnotations.dll`程序集的引用,并在匹配的命名空间`System.ComponentModel.DataAnnotations`中找到所有数据注解类。
##### 3.2 示例代码
以下是一个使用`StringLength`属性限制`ModelName`字段最大长度为25个字符的示例:
```csharp
[StringLength(25)]
[Display(Name = "Model Name", Description = "This is the retail product name.")]
public string ModelName
{
get { return modelName; }
set
{
modelName = value;
OnPropertyChanged(new PropertyChangedEventArgs("ModelName"));
}
}
```
##### 3.3 抛出注解错误
虽然数据注解很方便,但Silverlight的数据绑定系统仍需要抛出异常才能识别无效数据。可以使用`Validator`类的静态方法来测试数据注解并检查属性是否存在错误。示例代码如下:
```csharp
[StringLength(25)]
[Display(Name = "Model Name", Description = "This is the retail product name.")]
public string ModelName
{
get { return modelName; }
set
{
// Explicitly raise an exception if a data annotation attribute
// fails validation.
ValidationContext context = new ValidationContext(this, null, null);
context.MemberName = "ModelName";
Validator.ValidateProperty(value, context);
modelName = value;
OnPropertyChanged(new PropertyChangedEventArgs("ModelName"));
}
}
```
##### 3.4 数据注解的局限性
数据注解虽然强大,但并非适用于所有场景。它仍然要求数据类抛出异常来指示错误条件,这种设计模式并不总是合适的。因此,许多开发者更喜欢使用`IDataError`或`INotifyDataError`接口。
#### 4. 注解属性
要使用数据注解进行验证,需要在数据类的属性上添加合适的特性。以下是一些常用的注解属性:
| 属性 | 描述 | 示例 |
| ---- | ---- | ---- |
| `Required` | 指定字段必须存在,否则用户会收到错误 | `[Required()] public string ModelNumber { ... }` |
| `StringLength` | 设置字符串的最大长度,可选择设置最小长度 | `[StringLength(25, MinimumLength=5)] public string ModelName { ... }` |
| `Range` | 强制值落在最小值和最大值之间 | `[Range(0,1000)] public int UnitsInStock { ... }` |
| `RegularExpression` | 使用正则表达式测试文本值 | `[RegularExpression("^[A-Za-z0-9]+$")] public string ModelNumber { ... }` |
| `CustomValidation` | 允许在单独的类中编写自定义验证逻辑 | `[CustomValidat
0
0
复制全文
相关推荐









