Silverlight数据绑定全解析
立即解锁
发布时间: 2025-08-26 01:35:14 阅读量: 12 订阅数: 41 AIGC 


Silverlight 4 in VB: 创建跨平台浏览器应用
### Silverlight 数据绑定全解析
#### 一、禁用自动更新系统
当所有更新都通过代码进行时,可使用 `Binding` 对象的 `UpdateSourceTrigger` 属性禁用 Silverlight 的自动更新系统。示例代码如下:
```xml
<TextBox Text= "{Binding UnitCost, Mode=TwoWay, UpdateSourceTrigger=Explicit}"></TextBox>
```
`UpdateSourceTrigger` 仅支持两个值:`Default` 和 `Explicit`,不能像 WPF 那样选择 `PropertyChanged`。不过,借助一些代码和 `UpdateSource()` 方法,可按需进行更新。
需要注意的是,一旦允许用户编辑绑定数据,就需考虑如何捕获错误和处理无效数据。
#### 二、变更通知
在某些情况下,可能需要在数据对象绑定到一个或多个元素后对其进行修改。例如,以下代码将当前价格提高 10%:
```vb
Dim product As Product = CType(gridProductDetails.DataContext, Product)
product.UnitCost *= 1.1
```
若经常修改绑定对象,可将其存储在页面的字段中,避免每次都从 `DataContext` 属性中检索,简化代码并减少类型转换。
但上述代码无法达到预期效果,因为内存中的 `Product` 对象虽被修改,但绑定控件中不会显示更改。原因是缺少关键的基础设施,即 `Product` 对象无法通知绑定元素。
为解决此问题,数据类需实现 `System.ComponentModel.INotifyPropertyChanged` 接口。该接口定义了一个名为 `PropertyChanged` 的事件,数据对象的属性更改时,必须引发此事件并提供属性名称。
以下是使用 `INotifyPropertyChanged` 接口的改进版 `Product` 类定义:
```vb
Public Class Product
Implements INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
Public Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs)
If PropertyChangedEvent IsNot Nothing Then
RaiseEvent PropertyChanged(Me, e)
End If
End Sub
...
End Class
```
同时,需在所有属性设置器中触发 `PropertyChanged` 事件:
```vb
Private _unitCost As Double
Public Property UnitCost() As Double
Get
Return _unitCost
End Get
Set(ByVal value As Double)
_unitCost = value
OnPropertyChanged(New PropertyChangedEventArgs("UnitCost"))
End Set
End Property
```
使用此版本的 `Product` 类,更改当前 `Product` 对象时,新信息会立即显示在绑定文本框中。若多个值已更改,可调用 `OnPropertyChanged()` 并传入空字符串,让 Silverlight 重新评估绑定到类中任何属性的绑定表达式。
#### 三、构建数据服务
之前的示例虽介绍了 Silverlight 数据绑定的基本细节,但不够现实。更常见的设计是让 Silverlight 应用从外部源(如 Web 服务)检索所需的数据对象。
构建数据服务的步骤如下:
1. **移动数据对象类定义**:将数据对象的类定义移到 ASP.NET 网站。若创建无项目网站,需将代码文件放在 `App_Code` 文件夹;若创建 Web 项目,可放在任意位置。
2. **修改数据对象**:添加 `DataContract` 和 `DataMember` 属性使其可序列化,并添加公共无参构造函数。示例代码如下:
```vb
<DataContract()> _
Public Class Product
Implements INotifyPropertyChanged
Private _modelNumber As String
<DataMember()> _
Public Property ModelNumber() As String
Get
Return _modelNumber
End Get
Set(ByVal value As String)
_modelNumber = value
OnPropertyChanged(New PropertyChangedEventArgs("ModelNumber"))
End Set
End Property
Private _modelName As String
<DataMember()> _
Public Property ModelName() As String
Get
Return _modelName
End Get
Set(ByVal value As String)
_modelName = value
OnPropertyChanged(New PropertyChangedEventArgs("ModelName"))
End Set
End Property
...
Public Sub New()
End Sub
End Class
```
#### 四、Web 服务与 INotifyPropertyChanged
使用 Web 服务定义数据类时,可免费获得 Silverlight 变更通知。因为 Visual Studio 生成数据类的客户端副本时,会自动实现 `INotifyPropertyChanged` 接口,即使服务器端原始类未实现。
例如,定义一个简单的 `Product` 类:
```vb
<DataContract()> _
Public Class Product
<DataMember()> _
Public Property ModelNumber() As String
<DataMember()> _
Public Property ModelName() As String
<DataMember()> _
Public Property UnitCost() As Double
<DataMember()> _
Public Property Description() As String
End Class
```
客户端副本仍会实现 `INotifyPropertyChanged`,具有完整的属性过程,并在任何属性更改时调用 `OnPropertyChanged()` 引发通知事件。
可通过打开 Silverlight 项目中的 `Reference.vb` 文件查看数据类的客户端代码。是否在服务器端实现 `INotifyPropertyChanged` 取决于个人偏好。也可通过编辑 `Reference.svcmap` 文件禁用此功能,但通常没必要。
#### 五、数据服务的 Web 服务方法
有了数据对象后,需要一个使用它的 Web 服务方法。以下是基本框架:
```vb
<ServiceContract(Namespace := "")> _
Public Class StoreDb
Private connectionString As String = _
WebConfigurationManager.ConnectionStrings("StoreDb").ConnectionString
<OperationContract()> _
Public Function GetProduct(ByVal ID As Integer) As Product
...
End Function
End Class
```
查询通过数据库中名为 `GetProduct` 的存储过程执行,连接字符串从 `web.config` 文件中检索。以下是 `web.config` 文件中定义连接字符串的部分:
```xml
<configuration>
...
<connectionStr
```
0
0
复制全文
相关推荐









