代码改变世界

ObservableCollection<T> 类

2011-04-09 16:38  观海看云  阅读(3939)  评论(0编辑  收藏  举报

表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。

命名空间: System.Collections.ObjectModel
程序集: System(在 System.dll 中)
用于 XAML 的 XMLNS:未映射到 xmlns。

语法:

[SerializableAttribute]
  public class ObservableCollection<T> : Collection<T>,
      INotifyCollectionChanged, INotifyPropertyChanged

在许多情况下,所使用的数据是对象的集合。例如,数据绑定中的一个常见方案是使用 ItemsControl(如 ListBoxListViewTreeView)来显示记录的集合。

可以枚举实现 IEnumerable 接口的任何集合。 但是,若要设置动态绑定,以使集合中的插入或移除操作可以自动更新 UI,则该集合必须实现 INotifyCollectionChanged 接口。 此接口公开 CollectionChanged 事件,只要基础集合发生更改,都应该引发该事件。

WPF 提供 ObservableCollection< T> 类,它是实现 INotifyCollectionChanged 接口的数据集合的内置实现。

在实现自己的集合之前,请先考虑使用 ObservableCollection< T> 或一个现有的集合类,如 List< T> Collection< T> BindingList< T> 等。 如果有高级方案并且希望实现自己的集合,请考虑使用 IList,它提供可以通过索引逐个访问的对象的非泛型集合。 如果实现 IList,则将使用数据绑定引擎提供最佳性能。

关于 XAML 用法的说明

ObservableCollection< T> 可在 Windows Presentation Foundation (WPF) 3.0 和 3.5 版本中的一个 XAML 对象元素使用。 但是,使用情况有众多限制。

  • ObservableCollection< T> 必须是根元素,因为指定泛型 ObservableCollection< T> 的约束类型所必须使用的 x:TypeArguments 特性只在根元素的对象元素上受支持。

  • 您必须声明一个 x:Class 特性(此属性要求该 XAML 文件的生成操作必须是 Page 或某种编译 XAML 的其他生成操作)。

  • ObservableCollection< T> 所在的命名空间和程序集最初未映射到默认的 XML 命名空间。 您必须为该命名空间和程序集映射一个前缀,然后在 ObservableCollection< T> 的对象元素标记上使用该前缀。

在应用程序中使用 XAML 的 ObservableCollection< T> 功能的一种更直接的方法是声明自己的非泛型自定义集合类,该类派生自 ObservableCollection< T> 并将其约束为特定类型。 然后映射包含此类的程序集,并将其作为 XAML 中的对象元素进行引用。

 

 

public class NameList : ObservableCollection<PersonName>
{
    
public NameList() : base()
    {
        Add(
new PersonName("Willa""Cather"));
        Add(
new PersonName("Isak""Dinesen"));
        Add(
new PersonName("Victor""Hugo"));
        Add(
new PersonName("Jules""Verne"));
    }
  }

  
public class PersonName
  {
      
private string firstName;
      
private string lastName;

      
public PersonName(string first, string last)
      {
          
this.firstName = first;
          
this.lastName = last;
      }

      
public string FirstName
      {
          
get { return firstName; }
          
set { firstName = value; }
      }

      
public string LastName
      {
          
get { return lastName; }
          
set { lastName = value; }
      }
  }