2012-03-16 23 views
7

bir ObservableCollection bir öğeyi kaldırın. Ben ObservableCollection alt sınıfı veya görünümünde herhangi bir tür kullanabilmek için değilim, bu yüzden yasaklanmış öğelerle ilgili bir .remove() gerçekleştirmek için tanımlanmış bir olay işleyicisi (CollectionChanged) kullanılarak sınırlı görünüyor. Öğeler, olayın ortaya çıkarılması ve daha sonra ele alınması arasındaki kısa süre için mevcutsa iyi olur; öğeler koleksiyonda kalmamalı. CollectionChanged olay işleyicisindeki .Remove() çağrılmasına izin verilmiyor. Çalışma zamanında. NET'te bir InvalidOperationException:Onların bir ObservableCollection eklendikten sonra bazı öğeleri reddetmek mümkün umuyorum bir CollectionChanged olay işleyicisi

"Bir CollectedChanged olayı sırasında GözlenebilirKoleksiyon değiştirilemez.

Şahsen .NET bana izin vermelidir düşünüyorum. Sonsuz bir döngü oluşturursam, bu benim kendi hatam. Ben gibi görünecektir kullanmak istiyorum

kodu:

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

Elimde ne seçenekler emin değilim. Bir dağıtıcı kullanmak işe yaramıyor. Başka bir olayı tetiklemek ve .Remove çağrısını başka bir işleyiciye yerleştirmek, akla gelen diğer tek seçenek.

+0

Bir ObservableCollection öğesinden öğeleri kaldıramazsınız. Bu bir bütünün bütünüdür ... Sadece sardığı koleksiyondan öğeleri kaldırabilirsiniz. –

+0

Toplama değiştirilen olay işleyicisinde bunu yapmamalısınız. Bunun yerine, koleksiyonun değiştirilmesine izin vermeden önce filtreyi yapın. Uygun bir değişiklik olmaması durumunda koleksiyonun değiştirilmesine izin vermeyin. –

+0

Bunun eski olduğunu ve muhtemelen yapmanın 'doğru' yolunun olmadığını biliyorum; ama yaptım ve birilerine yardım edebilirim. OberservableCollection öğesinden seçili dosyaları silmeye çalışırken bu özel durumla aynı sorunu yaşıyordum. İkinci dosya kaldırma isteği Messenger'ım tarafından işlendiğinde, CollectionChange olayı hala duruyordu. Yani benim CollectionChanged olay işleyicisi içinde, ben 'kilit (this.Files) eklemek zorunda {// Olay Kod} Bunu yapan kez' Ben yine benim programı koştu ve çoklu dosya seçilir ve sil tuşuna basın. Bu sefer istisnasız, çünkü Kaldırmak zorunda kaldı. – famousKaneis

cevap

11

spin olabilir -

hala bu rotayı gitmek istiyorsan, Having. çünkü foreach döngüsündeki koleksiyonu değiştirmeye çalışıyorsunuz çünkü bu size acı veriyor. sözü

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

} 

örnek, sana bir CollectionChanged Olay içindeki bir ObservableCollection ile bu tür bir şey yapıyor ve kesinlikle edilmemesi gerektiğini Anurag katılıyorum. sırayla

0

kullanımı ToList() liste yineleme için.

foreach(var item in collection.ToList()) 
{ 
    if(item.Name == "Fred") 
    { 
     collection.Remove(item); 
    } 
} 
İlgili konular