c# - No se puede cambiar ObservableCollection durante un evento CollectionChanged
.net (1)
Tengo un evento CollectionChanged
que está vinculado a una CollectionChanged
ObservableCollection
. Este evento CollectionChanged
luego llama a otra función que está destinada a actualizar otra colección (del mismo tipo) con un elemento de la colección original. He leído otras publicaciones en " No se puede cambiar ObservableCollection durante un evento CollectionChanged " y entiendo completamente por qué está mal visto modificar una colección dentro de un evento CollectionChanged
y por qué esto puede resultar en una referencia circular ... pero en este particular En caso de que no esté modificando la colección original, solo estoy agregando un Artículo de ella a una colección no relacionada.
Entonces a mi pregunta ... ¿hay algo malo con lo que estoy haciendo? No veo cómo agregar un elemento de la colección con el evento vinculado a otra colección activará el evento nuevamente y creará una referencia circular (aunque, por favor, dígame si me equivoco al respecto).
Además ... ¿hay alguna manera de evitarlo? Leí varias publicaciones que recomiendan ejecutar esto en un subproceso separado, pero cuando intento obtener el siguiente error en su lugar.
This type of CollectionView does not support changes to its SourceCollection
from a thread different from the Dispatcher thread.
Realmente estoy buscando una mejor comprensión de lo que está pasando aquí. Cualquier consejo sería muy apreciado.
Editar
Ejemplo simplificado según lo solicitado.
void originalCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
update(originalCollection);
}
private void update(object parameter)
{
foreach (var originalCollectionItem in parameter)
newCollection.Add(originalCollectionItem);
}
Si está utilizando WindowsForms, asegúrese de usar el método Invocar en el formulario para mantener el código en ejecución en el hilo del Dispatcher.
http://msdn.microsoft.com/en-us/library/system.windows.forms.form.invoke.aspx
O, si usa WPF, use la clase Dispatcher.