ObservableCollection在.net中有什么用?

amrnrhlw  于 2022-11-26  发布在  .NET
关注(0)|答案(8)|浏览(183)

ObservableCollection在.net中有什么用?

zte4gxcn

zte4gxcn1#

ObservableCollection是一个集合,它允许集合外部的代码知道何时对集合进行更改(添加、移动、移除)。它在WPF和Silverlight中大量使用,但其用途并不限于此。代码可以添加事件处理程序以查看集合何时发生更改,然后通过事件处理程序做出React以执行一些其他处理。这可能是更改UI或执行一些其他操作。
下面的代码实际上并不做任何事情,只是演示了如何在类中附加一个处理程序,然后使用事件参数以某种方式对更改做出React。

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

oalqel3c2#

ObservableCollection的工作方式基本上与常规集合类似,只是它实现了以下接口:

因此,当你想知道集合什么时候发生了变化时,它是非常有用的。一个事件被触发,告诉用户哪些条目被添加/删除或移动了。
更重要的是,在表单上使用数据系结时,它们非常有用。

n8ghc7c1

n8ghc7c13#

Pro C# 5.0 and the .NET 4.5 Framework开始
ObservableCollection<T>类非常有用,因为它能够在其内容以某种方式发生更改时通知外部对象(正如您可能猜到的,使用ReadOnlyObservableCollection<T>非常相似,但本质上是只读的)。在许多方面,使用ObservableCollection<T>与使用List<T>是相同的,ObservableCollection<T>类的独特之处在于该类支持一个名为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属性。您可以针对NotifyCollectionChangedAction枚举的下列任何成员测试Action属性:

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

pkwftd7m

pkwftd7m4#

不带代码的说明

对于那些想要一个没有任何代码的答案(繁荣)与一个故事(帮助你记住):

正常收集-无通知

我偶尔去纽约,我妻子让我买东西。所以我随身带着一张购物清单。清单上有很多东西,比如:
1.路易威登手袋(5000美元)
1.克莱夫Christian)的帝王香水(Imperial Majesty)(21.5万美元)

  1. Gucci太阳镜(2000美元)
    哈哈哈,我不买那些东西。所以我把它们划掉,从列表中删除,我补充说:
  2. 12打Titleist高尔夫球
  3. 12磅的保龄球。
    所以我通常回家时都没带货,她也从来不生气,问题是她不知道我从清单上去掉了什么,又加了什么;她不会收到任何通知。

ObservableCollection -进行更改时的通知

现在,每当我从列表中删除一些内容时:她会收到通知
可观察集合的工作方式与此相同。如果您向其中添加或从中删除某些内容:通知某人。
当他们得到通知时,就掩体起来或者跑去找掩护!当然,后果是可以通过事件处理程序定制的。
很傻的故事,但希望你现在能记住这个概念。

owfi6suc

owfi6suc5#

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

**EDIT:**以下是来自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);
}
zzwlnbp8

zzwlnbp86#

它是一个集合,用于通知集合中大多数UI发生变化,它支持自动通知。
主要用于WPF、
假设您有一个包含列表框和添加按钮的UI,当您单击该按钮时,类型为的对象将被添加到observablecollection中,您将该集合绑定到列表框的ItemSource,因此只要您在集合中添加了一个新项,列表框就会更新自身并在其中再添加一项。

uxh89sit

uxh89sit7#

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

xytpbqjk8#

可观察集合警告

上文提到(赛义德·鲁胡拉·阿莱姆)
ObservableCollection类的独特之处在于该类支持名为CollectionChanged的事件。
请记住这一点...如果您向ObservableCollection添加大量项目,UI也会更新很多次。这可能会使您的UI变得混乱或冻结。一个解决方法是创建一个新列表,添加所有项目,然后将属性设置为新列表。这会点击UI一次。同样...这是用于添加大量项目的。

相关问题