<T> ve BindingList <T> Avantajları / Dezavantajları Listesi


93

Birisi benim projem için ikisi arasındaki farkın ne olduğunu açıklayabilir mi?

Şu anda bir List<MyClass>BindingSource var ve buna BindingSource ve DataGridView BindingSource.

Ben hayata geçirdik IEditableObjectCancelEdit Ben bir ile ne benim nesne geri dönmek çağrıldığında bu yüzdenMemberwise.Clone()

Listemi BindingList olarak değiştirmek bunlardan herhangi birini çözecek mi ve BindingList kullanmanın avantajları nelerdir?

Yanıtlar:


124

A List<>, belirli bir türdeki öğelerin birkaç yardımcı işlevle (örneğin: sıralama) otomatik olarak yeniden boyutlandırılan dizisidir. Bu sadece verilerdir ve modelinizdeki bir dizi nesne üzerinde işlemleri çalıştırmak için kullanmanız muhtemeldir.

A BindingList<>, IBindingListarayüzü uygulayan, yazılı bir listenin veya bir koleksiyonun etrafındaki bir sarmalayıcıdır . Bu, iki yönlü veri bağlamayı destekleyen standart arabirimlerden biridir. ListChangedÖğeleri eklediğinizde, kaldırdığınızda veya ayarladığınızda ortaya çıkan olayı uygulayarak çalışır . Bağlı kontroller, ekranlarını ne zaman yenileyeceklerini bilmek için bu olayı dinler.

Bir BindingSource'un DataSource değerini a olarak ayarladığınızda , listenizi sarmak için List<>dahili olarak bir oluşturur BindingList<>. Listenize BindingList<>BindingSource'un dışından erişmek istiyorsanız listenizi kendinize önceden paketlemek isteyebilirsiniz, ancak aksi halde aynıdır. BindingList<>Öğeleri değiştirirken özel davranışı uygulamak için de buradan devralabilirsiniz .

IEditableObjectBindingSource tarafından işlenir. Herhangi bir ilişkili denetimdeki verileri değiştirdiğinizde, herhangi bir uygulama nesnesinde BeginEdit'i çağırır. Daha sonra BindingSource üzerinde EndEdit / CancelEdit'i çağırabilirsiniz ve onu nesnenize iletir. Farklı bir satıra geçmek EndEdit'i de çağırır.


Şu anda benim List <T> yaklaşımımla CancelEdit'i çağırmak, düzenlenmekte olan öğeyi orijinal durumuna geri döndürmeyecek, dolayısıyla Clone () kullanıyorum. Bir bağlayıcı listenin bunu benim için halledeceğini mi söylüyorsun?
Jon

3
Hayır, BindingList'in bu işlevsellikle ilgisi yoktur. BindingSource, temel alınan listenin türüne bakılmaksızın geçerli nesne üzerinde CancelEdit'i çağırır. Çerçevede, düz nesneler için nesne sürümlemesini otomatik olarak uygulayan hiçbir şey yoktur. Sadece bu amaç için verilerin orijinal bir kopyasını tutan DataTables / DataRows'u kullanabilirsiniz.
Alex J

Liste değiştiğinde kontrollerin bilmesi gerektiğini söylüyorsunuz, biraz daha açıklayabilir misiniz? Bir veri görünümüne sahip bir formum ve ardından doldurulmuş verilerden başka bir formum var. Bu konudaki söylediklerin hakkında kendimi endişelendirmeli miyim?
Jon

Örneğin, yeni bir satır eklemek için DataGrid öğelerinin listenize ne zaman eklendiğini bilmesi gerekir. Bunun için BindingList'in ListChanged olayını kullanır. Izgarayı doğrudan bir List <T> 'ye bağlarsanız, olay olmazdı ve ızgara listeyi ne zaman değiştirdiğinizi bilemezdi. Senaryonuzda bunun için endişelenmenize gerek yok çünkü BindingSource List <T> 'yi sizin için bir BindingList içinde sarmalar. Listenin kendisi ile değil, BindingSource ile çalıştığınız sürece, kontroller senkronize kalacaktır.
Alex J

BindingList'i WPF kullanıcı arayüzüne (mvvm yolu) kullanmak için herhangi bir geçici çözüm var mı? Ciltleme listesini gözlemlenebilir bir koleksiyona sarabilir miyim?
Lance

13

Bir BindingList, olayları kullanarak iki yönlü veri bağlamaya izin verir, bir Liste, koleksiyonu değiştiğinde olayları tetiklemez.

Özel probleminizi çözeceğini sanmıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.