Qual è l'uso di ObservableCollection in .net?
Qual è l'uso di ObservableCollection in .net?
Risposte:
ObservableCollection è una raccolta che consente al codice esterno alla raccolta di sapere quando si verificano modifiche alla raccolta (aggiungi, sposta, rimuovi). È ampiamente utilizzato in WPF e Silverlight ma il suo utilizzo non è limitato a questo. Il codice può aggiungere gestori di eventi per vedere quando la raccolta è cambiata e quindi reagire attraverso il gestore di eventi per eseguire ulteriori elaborazioni. Questo potrebbe cambiare un'interfaccia utente o eseguire qualche altra operazione.
Il codice seguente non fa davvero nulla, ma dimostra come assoceresti un gestore in una classe e quindi usi gli arg dell'evento per reagire in qualche modo alle modifiche. WPF ha già molte operazioni come l'aggiornamento dell'interfaccia utente integrata in modo da poterle ottenere gratuitamente quando si utilizza 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
}
}
}
e.NewItems
e e.OldsItems
può essere nullo a seconda dell'azione. Potrebbe lanciare NullReferenceException
.
Un ObservableCollection
funziona essenzialmente come una raccolta regolare, tranne per il fatto che implementa le interfacce:
Pertanto è molto utile quando si desidera sapere quando la raccolta è stata modificata. Viene attivato un evento che indica all'utente quali voci sono state aggiunte / rimosse o spostate.
Ancora più importante, sono molto utili quando si utilizza la banca dati su un modulo.
Da Pro C # 5.0 e .NET 4.5 Framework
La ObservableCollection<T>
classe è molto utile in quanto ha la capacità di informare oggetti esterni quando i suoi contenuti sono cambiati in qualche modo (come puoi immaginare, lavorare con
ReadOnlyObservableCollection<T>
è molto simile, ma di sola lettura). In molti modi, lavorare con il ObservableCollection<T>
è identico a lavorare con List<T>
, dato che entrambe queste classi implementano le stesse interfacce di base. Ciò che rende ObservableCollection<T>
unica la classe è che questa classe supporta un evento denominato CollectionChanged
. Questo evento si attiva ogni volta che viene inserito un nuovo elemento, viene rimosso (o trasferito) un elemento corrente o se viene modificata l'intera raccolta. Come ogni evento, CollectionChanged è definito in termini di delegato, che in questo caso lo è
NotifyCollectionChangedEventHandler
. Questo delegato può chiamare qualsiasi metodo che accetta un oggetto come primo parametro e aNotifyCollectionChangedEventArgs
come il secondo. Considera il seguente metodo Main (), che popola una raccolta osservabile contenente oggetti Person e collega l'
CollectionChanged
evento:
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());
}
}
}
}
Il NotifyCollectionChangedEventArgs
parametro in entrata definisce due proprietà importanti
OldItems
e NewItems
, che forniranno un elenco di elementi che erano attualmente nella raccolta prima dell'evento generato, e i nuovi elementi coinvolti nella modifica. Tuttavia, vorrai esaminare questi elenchi solo nelle circostanze corrette. Ricorda che l'evento CollectionChanged può attivarsi quando gli elementi vengono aggiunti, rimossi, riposizionati o ripristinati. Per scoprire quale di queste azioni ha attivato l'evento, è possibile utilizzare la proprietà Action di NotifyCollectionChangedEventArgs. La proprietà Action può essere testata con uno dei seguenti membri diNotifyCollectionChangedAction
dell'enumerazione:
public enum NotifyCollectionChangedAction
{
Add = 0,
Remove = 1,
Replace = 2,
Move = 3,
Reset = 4,
}
Per coloro che desiderano una risposta senza alcun codice (boom-tish) alzerò la mano:
Raccolte normali - Nessuna notifica
Ogni tanto vado a New York e mia moglie mi chiede di comprare cose. Quindi porto con me una lista della spesa. L'elenco contiene molte cose come:
ahahah beh non sto comprando quella roba. Quindi li cancello e li rimuovo dalla lista e aggiungo invece:
Quindi di solito torno a casa senza la merce e non è mai contenta. Il fatto è che non sa cosa tolgo dall'elenco e cosa aggiungo; non riceve notifiche.
ObservableCollection: notifiche quando vengono apportate modifiche
Ora, ogni volta che rimuovo qualcosa dall'elenco: riceve una notifica sul suo telefono (ad esempio sms / email ecc.)!
La collezione osservabile funziona allo stesso modo. Se aggiungi o rimuovi qualcosa da o verso di esso: qualcuno viene avvisato. E quando vengono avvisati, allora ti chiamano e ti sentirai pieno. Naturalmente le conseguenze sono personalizzabili tramite il gestore eventi.
Questo riassume tutto!
Uno degli usi più importanti è che puoi associare i componenti dell'interfaccia utente a uno e risponderanno in modo appropriato se i contenuti della raccolta cambiano. Ad esempio, se si associa una risorsa di ListView a una, il contenuto di ListView si aggiornerà automaticamente se si modifica la raccolta.
EDIT: Ecco un po 'di codice di esempio da MSDN: http://msdn.microsoft.com/en-us/library/ms748365.aspx
In C #, agganciare ListBox alla raccolta potrebbe essere facile come
listBox.ItemsSource = NameListData;
tuttavia, se non hai collegato l'elenco come risorsa statica e definito NameItemTemplate, potresti voler sostituire ToString () di PersonName. Per esempio:
public override ToString()
{
return string.Format("{0} {1}", this.FirstName, this.LastName);
}
è una raccolta che viene utilizzata per comunicare principalmente all'interfaccia utente di modifiche nella raccolta, supporta la notifica automatica.
Utilizzato principalmente in WPF,
Supponiamo che tu abbia un'interfaccia utente con una casella di riepilogo e un pulsante Aggiungi e quando fai clic su di esso un oggetto di tipo supponi che una persona venga aggiunta alla raccolta obseravabl e tu associ questa raccolta a ItemSource of Listbox, quindi non appena hai aggiunto un nuovo elemento nella raccolta, Listbox si aggiornerà automaticamente e aggiungerà un altro elemento al suo interno.
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();
}