Silverlight数据绑定全解析
立即解锁
发布时间: 2025-08-26 01:42:32 阅读量: 11 订阅数: 46 AIGC 

# Silverlight 数据绑定全解析
## 1. 集合项的插入与移除
在与 Web 服务通信时,Silverlight 生成客户端代码会进行一些转换。Web 服务可能返回数组或列表集合,但客户端代码会将对象放入 `ObservableCollection` 中。若返回的对象带有集合属性,同样会进行此转换。
这是因为客户端不清楚 Web 服务器返回的集合类型,使用 `ObservableCollection` 更安全,它比数组或普通列表集合功能更丰富。
### 1.1 `ObservableCollection` 的优势
与列表一样,`ObservableCollection` 支持添加和移除项。例如,使用删除按钮执行以下代码删除项:
```csharp
private void cmdDeleteProduct_Click(object sender, RoutedEventArgs e)
{
products.Remove((Product)lstProducts.SelectedItem);
}
```
此代码对数组无效,对列表集合虽能移除项,但绑定列表中被删除的项仍会显示。要实现集合更改跟踪,需使用实现 `INotifyCollectionChanged` 接口的集合,在 Silverlight 中只有 `ObservableCollection` 类满足此要求。当使用 `ObservableCollection` 执行上述代码时,绑定列表会立即刷新。
当然,还需创建能永久提交此类更改的数据访问代码,如从后端数据库插入和移除产品的 Web 服务方法。
## 2. 绑定到 LINQ 表达式
Silverlight 支持 Language Integrated Query(LINQ),这是 .NET 3.5 引入的通用查询语法。LINQ 可用于任何有 LINQ 提供程序的数据源,借助 Silverlight 内置支持,可使用类似结构的 LINQ 查询从内存集合或 XML 文件中检索数据,还能对检索的数据进行过滤、排序、分组和转换。
### 2.1 示例
假设有一个名为 `products` 的 `Product` 对象集合,要创建一个仅包含成本超过 100 美元产品的新集合。使用过程式代码如下:
```csharp
// Get the full list of products.
List<Product> products = App.StoreDb.GetProducts();
// Create a second collection with matching products.
List<Product> matches = new List<Product>();
foreach (Product product in products)
{
if (product.UnitCost >= 100)
{
matches.Add(product);
}
}
```
使用 LINQ 则更简洁:
```csharp
// Get the full list of products.
List<Product> products = App.StoreDb.GetProducts();
// Create a second collection with matching products.
IEnumerable<Product> matches = from product in products
where product.UnitCost >= 100
select product;
```
此示例使用 LINQ to Objects,通过 LINQ 表达式查询内存集合中的数据。LINQ 表达式使用 `from`、`in`、`where` 和 `select` 等新语言关键字,这些是 C# 语言的一部分。
### 2.2 LINQ 与 `IEnumerable<T>`
LINQ 围绕 `IEnumerable<T>` 接口,无论使用何种数据源,每个 LINQ 表达式都会返回实现 `IEnumerable<T>` 的对象。由于 `IEnumerable<T>` 继承自 `IEnumerable`,可像绑定普通集合一样在 Silverlight 页面中绑定它:
```csharp
lstProducts.ItemsSource = matches;
```
与 `List` 和 `ObservableCollection` 类不同,`IEnumerable<T>` 接口不提供添加或移除项的方法。若需此功能,需使用 `ToArray()` 或 `ToList()` 方法将 `IEnumerable<T>` 对象转换为数组或列表集合。例如:
```csharp
List<Product> productMatches = matches.ToList();
```
`ToList()` 是扩展方法,定义在 `System.Linq.Enumerable` 辅助类中,需导入 `System.Linq` 命名空间才能使用。该方法会立即计算 LINQ 表达式,最终得到普通列表集合。若要使集合可编辑且绑定控件能立即显示更改,需将列表内容复制到新的 `ObservableCollection` 中。
## 3. 主 - 详细信息显示
可将其他元素绑定到列表的 `SelectedItem` 属性以显示当前选中项的更多详细信息,还能用类似技术构建数据的主 - 详细信息显示。例如,创建一个显示类别列表和产品列表的页面,用户选择类别时,第二个列表显示该类别下的产品。
### 3.1 实现步骤
#### 3..1.1 创建 `Category` 类
```csharp
public class Category : INotifyPropertyChanged
{
private string categoryName;
public string CategoryName
{
get { return categoryName; }
set { categoryName = value;
OnPropertyChanged(new PropertyChangedEventArgs("CategoryName"));
}
}
private List<Product> products;
public List<Product> Products
{
get { return products; }
set { products = value; OnPropertyChanged(new PropertyChangedEventArgs("Products")); }
}
public event PropertyChanged
```
0
0
复制全文
相关推荐










