.net中ObservableCollection有什么用?

.net中ObservableCollection有什么用?

176554 次浏览

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

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

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

listBox.ItemsSource = NameListData;

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

public override ToString()
{
return string.Format("{0} {1}", this.FirstName, this.LastName);
}
ObservableCollection的工作本质上像一个常规的集合,除了它实现了 接口:< / p >

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

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

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

主要用于WPF,

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

ObservableCollection是一个集合,它允许集合外部的代码知道何时发生了对集合的更改(添加、移动、删除)。它在WPF和Silverlight中被大量使用,但它的使用并不局限于这两个领域。代码可以添加事件处理程序,以查看集合何时发生更改,然后通过事件处理程序作出反应,执行一些额外的处理。这可能是更改UI或执行一些其他操作。

下面的代码实际上并没有做任何事情,只是演示了如何在类中附加处理程序,然后使用事件参数以某种方式对更改做出反应。WPF已经内置了许多操作,比如刷新UI,所以在使用observablecollection时可以免费获得这些操作

class Handler
{
private ObservableCollection<string> collection;


public Handler()
{
collection = new ObservableCollection<string>();
collection.CollectionChanged += HandleChange;
}


private void HandleChange(object sender, NotifyCollectionChangedEventArgs e)
{
foreach (var x in e.NewItems)
{
// do something
}


foreach (var y in e.OldItems)
{
//do something
}
if (e.Action == NotifyCollectionChangedAction.Move)
{
//do something
}
}
}
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();
}

Pro c# 5.0和。net 4.5框架

ObservableCollection<T>类非常有用,因为它具有通知外部对象的能力 当它的内容以某种方式发生变化时(正如您可能猜到的那样,使用 ReadOnlyObservableCollection<T>非常类似,但本质上是只读的)。 在很多方面,与 ObservableCollection<T>与使用List<T>是相同的,因为这两个类 实现相同的核心接口。ObservableCollection<T>类的独特之处在于这个 类支持名为CollectionChanged的事件。该事件将在插入新项、删除(或重新定位)当前项或修改整个集合时触发。 与任何事件一样,CollectionChanged是根据委托定义的,在本例中是委托 NotifyCollectionChangedEventHandler。这个委托可以调用任何以对象作为第一个参数,以NotifyCollectionChangedEventArgs作为第二个参数的方法。考虑以下Main() 方法,该方法填充一个包含Person对象的可观察集合,并将 CollectionChanged事件:< / p >
class Program
{
static void Main(string[] args)
{
// Make a collection to observe and add a few Person objects.
ObservableCollection<Person> people = new ObservableCollection<Person>()
{
new Person{ FirstName = "Peter", LastName = "Murphy", Age = 52 },
new Person{ FirstName = "Kevin", LastName = "Key", Age = 48 },
};
// Wire up the CollectionChanged event.
people.CollectionChanged += people_CollectionChanged;
// Now add a new item.
people.Add(new Person("Fred", "Smith", 32));


// Remove an item.
people.RemoveAt(0);


Console.ReadLine();
}
static void people_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// What was the action that caused the event?
Console.WriteLine("Action for this event: {0}", e.Action);


// They removed something.
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
Console.WriteLine("Here are the OLD items:");
foreach (Person p in e.OldItems)
{
Console.WriteLine(p.ToString());
}
Console.WriteLine();
}


// They added something.
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
// Now show the NEW items that were inserted.
Console.WriteLine("Here are the NEW items:");
foreach (Person p in e.NewItems)
{
Console.WriteLine(p.ToString());
}
}
}
}
传入的NotifyCollectionChangedEventArgs形参定义了两个重要的属性, OldItemsNewItems,它们将为您提供事件触发前当前在集合中的项的列表,以及涉及更改的新项。但是,您只需要在正确的情况下检查这些列表。回想一下,CollectionChanged事件可以在 添加、删除、重新定位或重置项目。为了发现哪些动作触发了事件, 你可以使用NotifyCollectionChangedEventArgs的Action属性。Action属性可以是

public enum NotifyCollectionChangedAction
{
Add = 0,
Remove = 1,
Replace = 2,
Move = 3,
Reset = 4,
}

Members of System.Collections.ObjectModel

无代码解释

对于那些想要答案背后没有任何代码(boom-tish)和一个故事(帮助你记住)的人:

正常收集-没有通知

我偶尔去纽约,我妻子会让我买东西。所以我随身带着购物清单。这个清单上有很多东西,比如:

  1. 路易威登手袋(5000美元)
  2. 克莱夫·克里斯蒂安的皇家香水(21.5万美元)
  3. 古驰太阳镜(2000美元)

哈哈哈,好吧,我不买那种东西。所以我把它们划掉,从列表中删除,取而代之的是:

  1. 12打Titleist高尔夫球。
  2. 12磅重的保龄球。

所以我通常不带东西回家,她从来不会生气,问题是她不知道我从清单上删除了什么,又添加了什么;她没有收到任何通知。

ObservableCollection—在发生更改时通知

现在,每当我从列表中删除一些东西,她就会收到通知。

可观察集合的工作原理与此相同。如果你在其中添加或删除一些东西:有人会收到通知。

他们接到通知后,要么躲起来,要么找掩护!当然,可以通过事件处理程序自定义结果。

很傻的故事,但希望你们现在能记住这个概念。

ObservableCollection警告

上面提到的(Said Roohullah Allem)

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