代码之家  ›  专栏  ›  技术社区  ›  santosh singh

在.net中,ObservableCollection有什么用途?

  •  208
  • santosh singh  · 技术社区  · 15 年前

    在.net中,ObservableCollection有什么用途?

    7 回复  |  直到 11 年前
        1
  •  213
  •   Uwe Keim    8 年前

    ObservableCollection是一个集合,当集合发生更改(添加、移动、移除)时,允许集合外部的代码知道这些更改。它在WPF和Silverlight中被大量使用,但它的使用并不局限于此。代码可以添加事件处理程序以查看集合何时发生更改,然后通过事件处理程序进行响应以执行某些附加处理。这可能是在更改用户界面或执行其他操作。

    下面的代码实际上什么也不做,只是演示如何在类中附加处理程序,然后使用事件参数以某种方式对更改作出反应。WPF已经有很多操作,比如刷新内置的UI,这样在使用observatecollection时就可以免费获得它们

    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
            }
        }
    }
    
        2
  •  153
  •   Bakudan Lovely    9 年前

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

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

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

        3
  •  51
  •   x19    11 年前

    Pro C# 5.0 and the .NET 4.5 Framework

    这个 ObservableCollection<T> 类非常有用,因为它能够通知外部对象 当它的内容以某种方式改变时(如您所料,使用 ReadOnlyObservableCollection<T> 非常相似,但本质上是只读的)。 在很多方面,与 这个 可观测集合<T> 与使用 List<T> ,假设这两个类 实现相同的核心接口。是什么使 可观测集合<T> 类唯一的是 类支持名为 CollectionChanged . 每当插入新项、删除(或重新定位)当前项或修改整个集合时,将触发此事件。 与任何事件一样,CollectionChanged是根据委托定义的,在本例中是 NotifyCollectionChangedEventHandler . 此委托可以调用任何将对象作为第一个参数的方法,并且 NotifyCollectionChangedEventArgs 作为第二个。考虑以下Main() 方法,它填充包含Person对象的可观察集合,并将 集合已更改 事件:

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

    即将到来的 通知集合ChangedEventArgs 参数定义了两个重要的属性, OldItems NewItems ,它将为您提供激发事件之前当前在集合中的项的列表,以及参与更改的新项。但是,您只想在正确的情况下检查这些列表。回想一下,当 添加、移除、重新定位或重置项。要发现是哪一个动作触发了事件, 可以使用NotifyCollectionChangedEventArgs的Action属性。Action属性可以是 对下列任何成员进行测试 NotifyCollectionChangedAction 枚举:

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

    Members of System.Collections.ObjectModel

        4
  •  23
  •   BenKoshy Mayinx    7 年前

    无代码解释

    对于那些想得到答案却没有任何暗号的人,我将举手:

    普通集合-无通知

    我偶尔去纽约,我妻子让我买东西。所以我带了一张购物单。名单上有很多东西,比如:

    1. 路易威登手袋(5000美元)
    2. 克莱夫基督徒皇家香水(215000美元)
    3. 古奇太阳镜(2000美元)

    哈哈哈,我不买那种东西。所以我把它们划掉,从列表中删除,然后添加:

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

    所以我通常不带货回家,她也不高兴。问题是她不知道我从名单上删除了什么,我又添加了什么;她没有收到任何通知。

    ObservableCollection-更改时的通知

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

    可观察的集合的工作方式是一样的。如果向其中添加或从中删除某些内容:将通知某人。当他们接到通知的时候,他们会打电话给你,你会听到的。当然,结果可以通过事件处理程序定制。

    总而言之!

        5
  •  7
  •   Sean U    15 年前

    最大的用途之一是可以将UI组件绑定到一个组件,如果集合的内容发生更改,它们将做出相应的响应。例如,如果将ListView的ItemsSource绑定到一个,则如果修改集合,ListView的内容将自动更新。

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

    在C#中,将列表框挂接到集合可以像

    listBox.ItemsSource = NameListData;
    

    不过,如果您还没有将列表作为静态资源连接起来并定义nameitemplate,则可能需要重写PersonName的ToString()。例如:

    public override ToString()
    {
        return string.Format("{0} {1}", this.FirstName, this.LastName);
    }
    
        6
  •  6
  •   TalentTuner    15 年前

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

    主要用于WPF,

    假设您有一个带有列表框和添加按钮的UI,当您单击该按钮时,一个类型为“假设人”的对象将被添加到observablecollection,并且您将此集合绑定到list box的ItemSource,因此只要您在集合中添加了一个新项,Listbox将更新自身并在其中添加一个项。

        7
  •  5
  •   abatishchev Karl Johan    15 年前
    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();
    }