.net中ObservableCollection有什么用?


当前回答

ObservableCollection本质上与常规集合类似,只是它实现了 的接口:

INotifyCollectionChanged, INotifyPropertyChanged

因此,当您想知道集合何时发生更改时,它非常有用。触发一个事件,告诉用户添加/删除或移动了哪些条目。

更重要的是,当在表单上使用数据绑定时,它们非常有用。

其他回答

ObservableCollection本质上与常规集合类似,只是它实现了 的接口:

INotifyCollectionChanged, INotifyPropertyChanged

因此,当您想知道集合何时发生更改时,它非常有用。触发一个事件,告诉用户添加/删除或移动了哪些条目。

更重要的是,当在表单上使用数据绑定时,它们非常有用。

最大的用途之一是可以将UI组件绑定到一个组件上,如果集合的内容发生变化,它们将适当地响应。例如,如果你将一个ListView的ItemsSource绑定到一个,如果你修改了集合,ListView的内容将自动更新。

编辑: 下面是一些来自MSDN的示例代码: http://msdn.microsoft.com/en-us/library/ms748365.aspx

在c#中,将ListBox连接到集合非常简单

listBox.ItemsSource = NameListData;

但是如果你还没有将列表作为静态资源连接起来并定义NameItemTemplate,你可能想要重写PersonName的ToString()。例如:

public override ToString()
{
    return string.Format("{0} {1}", this.FirstName, this.LastName);
}

它是一个集合,用于通知大多数UI在集合中发生变化,它支持自动通知。

主要用于WPF,

假设你有一个带有列表框和add按钮的UI,当你点击按钮时,一个类型为suppose person的对象会被添加到observable集合中,你将这个集合绑定到Listbox的ItemSource,所以只要你在集合中添加了一个新项目,Listbox就会更新自己并在其中添加一个项目。

ObservableCollection警告

上面提到的(Said Roohullah Allem)

ObservableCollection类的独特之处在于 类支持名为CollectionChanged的事件。

记住这一点……如果你在ObservableCollection中添加了大量的项目,UI也会更新很多次。这可能会阻塞或冻结你的UI。 一种解决方法是创建一个新列表,添加所有的项目,然后将属性设置为新列表。这只会触及UI一次。再次……这是为了添加大量的项目。

class FooObservableCollection : ObservableCollection<Foo>
{
    protected override void InsertItem(int index, Foo item)
    {
        base.Add(index, Foo);

        if (this.CollectionChanged != null)
            this.CollectionChanged(this, new NotifyCollectionChangedEventArgs (NotifyCollectionChangedAction.Add, item, index);
    }
}

var collection = new FooObservableCollection();
collection.CollectionChanged += CollectionChanged;

collection.Add(new Foo());

void CollectionChanged (object sender, NotifyCollectionChangedEventArgs e)
{
    Foo newItem = e.NewItems.OfType<Foo>().First();
}