在.net中使用ObservableCollection有什么用?

时间:2010-11-25 16:38:07

标签: c# .net observablecollection

.net中的ObservableCollection有什么用途?

8 个答案:

答案 0 :(得分:204)

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

下面的代码并没有真正做任何事情,只是演示了如何在类中附加处理程序然后使用事件args以某种方式对更改做出反应。 WPF已经有许多操作,比如刷新内置的UI,因此在使用ObservableCollections时可以免费获取它们

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
        }
    }
}

答案 1 :(得分:148)

ObservableCollection的工作原理与常规集合类似,但它实现的除外 接口:

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

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

答案 2 :(得分:49)

来自Pro C# 5.0 and the .NET 4.5 Framework

ObservableCollection<T>类非常有用,因为它具有通知外部对象的能力 当它的内容以某种方式改变时(正如你可能猜到的那样,使用它 ReadOnlyObservableCollection<T>非常相似,但在本质上是只读的。 在很多方面,与...合作 考虑到这两个类,ObservableCollection<T>与使用List<T>相同 实现相同的核心接口。是什么让ObservableCollection<T>类与众不同 class支持名为CollectionChanged的事件。只要插入新项目,删除(或重新定位)当前项目,或者修改整个集合,就会触发此事件。 与任何事件一样,CollectionChanged是根据委托来定义的,在这种情况下是委托 NotifyCollectionChangedEventHandler。此委托可以调用任何将对象作为第一个参数的方法,并将NotifyCollectionChangedEventArgs作为第二个参数。考虑以下Main() 方法,它填充包含Person对象并连接到的对象的可观察集合 CollectionChanged事件:

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属性可以是 针对NotifyCollectionChangedAction枚举的以下任何成员进行了测试:

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

Members of System.Collections.ObjectModel

答案 3 :(得分:18)

无代码说明

对于那些想要回答而没有任何代码的人(繁荣时期),我会举起手来:

正常收藏 - 无通知

我偶尔去纽约,我的妻子要我买东西。所以我带了一个购物清单。这个清单上有很多东西,如:

  1. 路易威登手提包($ 5000)
  2. Clive Christian的皇家陛下香水($ 215,000)
  3. Gucci太阳镜(2000美元)
  4. 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈!
    1. 12打Titleist高尔夫球。
    2. 12磅保龄球。
    3. 所以我通常没有货物回家,她从不高兴。问题是,她不知道我从列表中删除了什么以及我添加了什么;她没有得到通知。

      ObservableCollection - 进行更改时的通知

      现在,每当我从列表中删除某些内容时,她就会在她的手机上收到通知(即短信/电子邮件等)!

      可观察集合的工作方式相同。如果您在其中添加或删除某些内容:会通知某人。当他们收到通知后,他们会打电话给你,你会得到满满的。当然后果可以通过事件处理程序自定义。

      总结一切!

答案 4 :(得分:7)

最大的用途之一是您可以将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);
}

答案 5 :(得分:6)

它是一个集合,用于通知UI在集合中进行更改,它支持自动通知。

主要用于WPF,

在哪里假设你有一个带有列表框的UI并添加按钮,当你点击他的按钮时,一个类型的对象会被添加到obseravablecollection中,你将这个集合绑定到Listbox的ItemSource,所以尽快您在集合中添加了一个新项目,Listbox将自行更新并在其中添加一个项目。

答案 6 :(得分:6)

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();
}

答案 7 :(得分:0)

ObservableCollection警告

上面提到的(Roohullah Allem说)

使ObservableCollection类独特的原因是 类支持一个名为CollectionChanged的事件。

请记住这一点...如果您向ObservableCollection添加大量项目,则UI也会更新很多次。这确实可以使您的UI陷入困境或冻结。 解决方法是创建一个新列表,添加所有项目,然后将属性设置为新列表。这将一次击中UI。再次...这是用于添加大量项目。