2012-03-16 39 views
7

Espero poder rechazar algunos elementos después de que se hayan agregado a un ObservableCollection. No puedo hacer una subclase de ObservableCollection ni utilizar ningún tipo de vista, por lo que me parece que estoy limitado a usar el controlador de evento definido (CollectionChanged) para realizar un .Remove() en los elementos prohibidos. Está bien si los artículos existen para el período corto entre el evento que se genera y luego se maneja; los artículos simplemente no deberían persistir en la colección. Llamar .Remove() dentro del controlador de eventos CollectionChanged no parece estar permitido. En tiempo de ejecución, .NET lanza una InvalidOperationException:Eliminar un elemento de un ObservableCollection en un controlador de eventos CollectionChanged

"No se puede cambiar ObservableCollection durante un evento CollectionChanged".

Personalmente creo que .NET debería permitirme. Si creo un bucle infinito, es mi propia maldición.

El código me gustaría utilizar se vería así:

myCollection.CollectionChanged += (sender, args) => 
{ 
    if (args.Action == NotifyCollectionChangedAction.Remove) 
     return; 
    foreach (var itm in myCollection) 
    { 
     if (itm.name == "Fred") 
      myCollection.Remove(itm); 
    } 
} 

no estoy seguro de qué opciones tengo. Usar un despachador no parece funcionar. Disparar otro evento y colocar la llamada .Remove en otro controlador es la única otra opción que se nos viene a la mente.

+0

No se pueden eliminar elementos de un ObservableCollection. Ese es el punto de una ... Solo podría eliminar elementos de la colección que está envolviendo. –

+0

No debe hacerlo en el controlador de eventos de colección modificada. En su lugar, haga el filtro antes de permitir que se cambie la colección. No permita que se cambie la colección si no es un cambio apropiado. –

+0

Sé que esto es viejo y probablemente no es la manera "correcta" de hacerlo; pero es lo que hice y puedo ayudar a alguien. Estaba teniendo el mismo problema de obtener esa excepción cuando intentaba eliminar los archivos seleccionados de OberservableCollection. El evento CollectionChange se estaba disparando, cuando Messenger procesaba la segunda solicitud de eliminación de archivos. Así que en mi controlador de evento CollectionChanged, tuve que agregar 'lock (this.Files) {// Código del evento}' Una vez que hice esto, ejecuté mi programa nuevamente y seleccioné varios archivos y presioné eliminar. Esta vez no fue una excepción, ya que el Remove tuvo que esperar. – famousKaneis

Respuesta

11

si realmente desea modificar una colección que se va a querer para iterar a través de una copia de la colección. es porque estás tratando de modificar la colección en el ciclo foreach eso te está causando dolor.

ejemplo

var copy = new ObservableCollection<YourType>(collection) 
foreach(var item in copy) 
{ 
    if(item.Name == "Fred") 
    { 
     collection.Remove(item); 
    } 

} 

que dijo: Estoy de acuerdo con Anurag que no debería estar haciendo este tipo de cosas con un ObservableCollection y ciertamente no en el interior de un evento CollectionChanged.

0

utilice un ToList() para iterar sobre la lista.

foreach(var item in collection.ToList()) 
{ 
    if(item.Name == "Fred") 
    { 
     collection.Remove(item); 
    } 
} 
Cuestiones relacionadas