J'ai une classe qui hérite de ObservableCollection
et ajoute quelques méthodes supplémentaires telles que AddRange
et RemoveRange
Mon appel de méthode de base est le suivant:
public void AddRange(IEnumerable<T> collection)
{
foreach (var i in collection) Items.Add(i);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
Mon problème avec ceci est que je veux accéder à e.NewItems
ou e.OldItems
dans l'événement CollectionChanged
pour effectuer une action sur n'importe quel élément de la collection, et NotifyCollectionChangedAction.Reset
l'action ne passe pas dans ces valeurs
void Instances_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null) // e.NewItems is always null
{
foreach (var item in e.NewItems)
{
if (item is EventInstanceModel)
((EventInstanceModel)item).ParentEvent = this;
}
}
}
J'ai donc pensé que je pouvais simplement utiliser le NotifyCollectionChangedAction.Add
au lieu de Reset
, mais cela lance un Range actions are not supported
exception
public void AddRange(IEnumerable<T> collection)
{
var addedItems = collection.ToList();
foreach (var i in addedItems) Items.Add(i);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedItems));
}
Donc, ma question est, comment puis-je déclencher un événement CollectionChanged et lui transmettre la nouvelle ou l'ancienne liste d'éléments?
Je l'ai étudié et apparemment, la méthode CollectionChanged
ne peut pas être déclenchée avec plusieurs éléments.
Je peux donc appeler
OnCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, singleItem));
mais je ne peux pas appeler
OnCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, listOfItems));
Pour l'instant, ce que j'ai fait est simplement de déclencher l'événement Add pour chaque élément ajouté, mais je suis plutôt mécontent car cela signifie que je déclenche l'événement CollectionChanged
pour chaque élément de la méthode AddRange
au lieu d'une seule fois.
public void AddRange(IEnumerable<T> collection)
{
foreach (var i in collection)
{
Items.Add(i);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, i));
}
}
Cela fonctionne bien pour moi "autonome". Ce qui signifie que je n'utilise pas de ObservableCollection
pour la liaison de données. Ce n'est donc pas un problème de ObservableCollection
mais plutôt une limitation de ListCollectionView
.
Veuillez lire l'article suivant, c'est une lecture très intéressante: