2010-11-25 9 views
165

Was nutzt ObservableCollection in .net?Was nutzt ObservableCollection in .net?

+1

@ alpha-Maus: Können Sie ein bisschen mehr Informationen über das Problem Sie versuchen zu lösen geben? Dies wird Ihnen helfen, Ihnen relevante Beispiele zu geben. – Jazza

+0

@Jazza: Ich habe gerade Tags die Frage geändert =) I't santosh Frage –

+2

Down-Wähler bitte Erklärung –

Antwort

158

ObservableCollection ist eine Sammlung, die auftreten, Code außerhalb der Sammlung sich bewusst sein, wenn Änderungen an der Sammlung (hinzufügen, verschieben, entfernen) ermöglicht. Es wird stark in WPF und Silverlight verwendet, aber seine Verwendung ist nicht darauf beschränkt. Code kann Ereignishandler hinzufügen, um zu sehen, wann sich die Sammlung geändert hat, und dann über den Ereignishandler reagieren, um eine zusätzliche Verarbeitung durchzuführen. Dies kann eine Benutzeroberfläche ändern oder eine andere Operation ausführen.

Der folgende Code nicht wirklich etwas zu tun hat, sondern zeigt, wie Sie einen Handler in einer Klasse anschließen würde und dann die Veranstaltung args verwenden in irgendeiner Weise auf die Veränderungen zu reagieren.WPF hat bereits viele Operationen wie die Benutzeroberfläche in so gebaut erfrischende Sie sie kostenlos bekommen, wenn 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 
     } 
    } 
} 
+3

das ist eine gute Erklärung. – Kings

+11

'e.NewItems' &' e.OldsItems' kann in Abhängigkeit von der Aktion null sein. Es kann "NullReferenceException" auslösen. – dovid

+2

sidennote: Wenn Action Move ist, wird das verschobene Element sowohl in NewItems als auch in OldItems –

6

Einer der größten Anwendungen ist, dass Sie UI-Komponenten zu einer binden können, und sie werden entsprechend reagieren, wenn die Sammlung des Inhalts ändern. Wenn Sie beispielsweise die ItemsSource einer ListView mit einer verknüpfen, wird der Inhalt der ListView automatisch aktualisiert, wenn Sie die Auflistung ändern.

EDIT: Hier einige Beispielcode von MSDN: http://msdn.microsoft.com/en-us/library/ms748365.aspx

In C#, die List-Box auf die Sammlung Einhaken könnte so einfach sein wie

listBox.ItemsSource = NameListData; 

obwohl, wenn Sie nicht süchtig haben Wenn Sie die Liste als statische Ressource auflisten und das definierte NameItemTemplate definieren, können Sie ToString() von PersonName überschreiben. Zum Beispiel:

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

Ein ObservableCollection arbeitet im Wesentlichen eine regelmäßige Ansammlung mögen, außer dass es implementiert die Schnittstellen:

Als solches ist es sehr nützlich, wenn Sie wissen möchten, wann sich die Sammlung geändert hat. Es wird ein Ereignis ausgelöst, das dem Benutzer anzeigt, welche Einträge hinzugefügt/entfernt oder verschoben wurden.

Noch wichtiger sind sie sehr nützlich, wenn auf einem Formular-Datenbindung verwenden.

6

es eine Sammlung ist, die meist UI zu benachrichtigen, verwendet wird, nicht in der Sammlung zu ändern, es unterstützt die automatische Benachrichtigung.

Vor allem in WPF verwendet,

Wo Sie UI mit einem Listenfeld haben sagen annehmen und Taste hinzufügen und wenn Sie auf ihm ein Objekt vom Typ suppose Person Schaltfläche klicken, wird auf das obseravablecollection hinzugefügt werden und Sie diese Sammlung binden Wenn Sie ein neues Element in der Sammlung hinzugefügt haben, aktualisiert Listbox sich selbst und fügt ein weiteres Element hinzu.

+0

wirklich passiert das ?? : O – Kings

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

Von Pro C# 5.0 and the .NET 4.5 Framework

Die ObservableCollection<T> Klasse ist sehr nützlich bei der Verwendung, dass es die Fähigkeit hat, zu informieren externe Objekte , wenn seine Inhalte in irgendeiner Weise geändert haben (wie Sie vermuten, ist die Arbeit mit ReadOnlyObservableCollection<T> ist sehr ähnlich, aber schreibgeschützt in der Natur). In vielerlei Hinsicht ist das Arbeiten mit ObservableCollection<T> identisch mit dem Arbeiten mit List<T>, vorausgesetzt, dass beide Klassen die gleichen Kernschnittstellen implementieren. Was die Klasse ObservableCollection<T> einzigartig macht, ist, dass diese Klasse ein Ereignis mit dem Namen CollectionChanged unterstützt. Dieses Ereignis wird ausgelöst, wenn ein neues Element eingefügt, ein aktuelles Element entfernt (oder verschoben) wird oder wenn die gesamte Sammlung geändert wird. Wie jedes Ereignis wird CollectionChanged in Bezug auf einen Delegaten definiert, in diesem Fall . Dieser Delegat kann jede Methode aufrufen, die ein Objekt als ersten Parameter verwendet, und eine NotifyCollectionChangedEventArgs als zweite. Betrachten Sie die folgenden Main() Methode, die das CollectionChanged Ereignis eine beobachtbare Sammlung enthält Person Gegenstände und Drähte bis auffüllt:

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

Die eingehenden NotifyCollectionChangedEventArgs Parameter definieren zwei wichtige Eigenschaften, OldItems und NewItems, die Sie eine Liste der Elemente, die sich vor dem Ereignis in der Sammlung befanden, und die neuen Elemente, die an der Änderung beteiligt waren. Sie sollten diese Listen jedoch nur unter den richtigen Umständen untersuchen. Sie erinnern sich, dass das CollectionChanged-Ereignis ausgelöst werden kann, wenn Elemente hinzugefügt, entfernt, verschoben oder zurückgesetzt werden. Um festzustellen, welche dieser Aktionen das Ereignis ausgelöst hat, können Sie die Action-Eigenschaft von NotifyCollectionChangedEventArgs verwenden, . Die Action-Eigenschaft kann gegen eine der folgenden Mitglieder der NotifyCollectionChangedAction Aufzählung getestet werden:

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

Members of System.Collections.ObjectModel

+0

angezeigt. Wird das people_CollectionChanged -Ereignis ausgelöst, wenn ich den Namen einer Person in der Sammlung ändere (ohne die Sammlung selbst zu ändern?) – BKSpurgeon

9

Für diejenigen, die Antwort ohne Code dahinter (Boom-tish) Ich werde mein werfen Hand nach oben:

Normale Kollektionen - Keine Benachrichtigungen

Hin und wieder gehe ich in NYC und mein Freund fragt mich zu kaufen Sachen. Also nehme ich eine Einkaufsliste mit. Die Liste hat eine Menge Dinge dort mag:

  1. Die 7 Wege zur Effektivität
  2. Clive Christian Imperial Majesty ($ 215.000)
  3. Ferrari ($ 750.000)

Well I“ Ich kaufe diese Sachen nicht, also überkreuze ich sie und entferne sie von der Liste und füge stattdessen hinzu:

  • 12 Dutzend Titleist Golfbälle.
  • Die Sache ist, dass mein Freund nicht weiß, was ich von der Liste nehme und was ich dazu addiere. Der Freund erhält keine Benachrichtigungen.

    Die ObservableCollection - Benachrichtigungen, wenn Änderungen gemacht

    So komme ich in der Regel zu Hause, ohne die Waren und Freundes nie zufrieden.

    Buuuut jetzt Freund hat eine App auf Freund Telefon bekommt: wenn ich etwas aus der Liste entfernen: Freund eine Benachrichtigung auf Freunde Telefon bekommt (das heißt eine SMS oder E-Mail, etc.)!

    Die beobachtbaren Sammlung funktioniert auf die gleiche Weise. Wenn Sie etwas hinzufügen oder entfernen: Jemand wird benachrichtigt. Und wenn sie benachrichtigt werden, dann rufen sie dich an und du wirst ein Ohr voll bekommen. Natürlich können die Konsequenzen über den Event-Handler angepasst werden.

    , dass sie alle zusammenfasst!

    +2

    Sie sollten a schreiben Buch. –