2010-11-29 40 views
8

WPF databinding kullanıldığında, bağların eski koleksiyona bir başvurusu olduğundan, MyCollection = new CollectionType<Whatever>(WhateverQuery()); satırlarında bir şey yapamıyorum. Şu ana kadarki çözümüm, MyCollection.Add(item); - MyCollection.Clear(); ve ardından bir foreach yapıyordu - bu hem performans hem de estetik için oldukça kötü.WPF: Veri toplama toplama içeriğinin Clear/Add olmadan değiştirilmesi

ICollectionView, çok zarif olmasına rağmen, sorunu çözmez ya da SourceCollection mülkiyet salt okunur olduğundan; bummer, çünkü bu hoş ve kolay bir çözüm olurdu.

Diğer insanlar bu sorunu nasıl ele alıyor? MVVM yapıyorum ve böylece bireysel kontrol bağlamaları ile rummage olamayacağı belirtilmelidir. Bir metoduyla spor yaparken, ObservableCollection civarında bir ambalaj yazabilirim, ancak bu rotaya gitmeden önce, başka en iyi uygulamaların olup olmadığını bilmek istiyorum.

DÜZENLEME: WinForms için

, bana sadece bunun DataSource mülkü güncelleme ve ResetBindings() yöntemi çağırmak için izin bir BindingSource karşı denetimlerini bağlamak istiyorum - koleksiyon verimli değişti yatan, saygınlık. WPF veritabanını kutudan benzer bir senaryoyu desteklemesini bekler miydim?

Örnek (sözde-ish) kodu: WPF denetimi (ListBox, DataGrid, ne isterseniz), Users özelliğine bağlıdır. Ben koleksiyonları salt okunur gerektiğini ReloadUsersBad() gösterdiği sorunlardan kaçınmak için, ama sonra bu örnek için kötü kod Açıkçası aşağıda bağlantısı bir AddRange yönteminin nasıl uygulanacağını açıklar :)

public class UserEditorViewModel 
{ 
    public ObservableCollection<UserViewModel> Users { get; set; } 

    public IEnumerable<UserViewModel> LoadUsersFromWhateverSource() { /* ... */ } 

    public void ReloadUsersBad() 
    { 
     // bad: the collection is updated, but the WPF control is bound to the old reference. 
     Users = new ObservableCollection<User>(LoadUsersFromWhateverSource()); 
    } 

    public void ReloadUsersWorksButIsInefficient() 
    { 
     // works: collection object is kept, and items are replaced; inefficient, though. 
     Users.Clear(); 
     foreach(var user in LoadUsersFromWhateverSource()) 
      Users.Add(user); 
    } 

    // ...whatever other stuff. 
} 
+0

Bazı kodlar gönderebilir misiniz? – TalentTuner

+0

+1 iyi soru. WPF'de bir süredir hiçbir şey yapmadım, ancak farklı bir dilde başka bir çerçeve benzer kavramlara sahip ve bu sorunu, çalışma döngüsünü durdurarak, çok sayıda özelliği değiştirerek ve sonra da çalışma döngüsünü duraklatmakla çözüyor. Benzer bir şey arıyorum. –

cevap

4

MyCollection nesnesi, INotifyPropertyChanged uygularsa, yalnızca koleksiyonu değiştirebilirsiniz.

Bir örnek: Bununla

public class MyClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private ObservableCollection<Whatever> _myCollection; 

    private void NotifyChanged(string property) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 

    public ObservableCollection<Whatever> MyCollection 
    { 
     get 
     { 
      return _myCollection; 
     } 
     set 
     { 
      if (!ReferenceEquals(_myCollection, value)) 
      { 
       _myCollection = value; 
       NotifyChanged("MyCollection"); 
      } 
     } 
    } 
} 

, Bir koleksiyonu atarken, WPF bu algılar ve her şeyi güncellenir.

Bunu nasıl çözebilirim.

+0

Tabii ki ... Daha önce bunu yapmak zorunda olduğumdan kesinlikle eminim. –

+0

D'oh!Basit ve açık bir şey olmalıydı, değil mi? : P – snemarch

+0

Sorun değil, yardımcı olabileceğime sevindim. –

1

derlemek olmaz biliyoruz. Eğer bu doğru durumda işler bir alt sınıf uygulama ile sıkışmış konum gibi

http://blogs.msdn.com/b/nathannesbit/archive/2009/04/20/addrange-and-observablecollection.aspx

görünüyor.

Bazı denetimler, toplu denetim değişikliği bildirimlerini desteklemiyor. En azından bu yazı yazıldığı zaman yapmadılar. Yine de daha fazla araştırmak istiyorsanız biraz daha fazla bilgiye sahip olmalısınız.

+0

Toplu güncelleştirmelerle (tamamen değiştirmenin aksine) ilgili iyi bir makale - 'ListCollectionView' yalnızca tekli öğe güncelleştirmelerini destekler: – snemarch