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.
}
Bazı kodlar gönderebilir misiniz? – TalentTuner
+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. –