2009-01-18 19 views
22

Son iki yılda bazı veri tabanlı Winforms Uygulaması geliştirdim ve her şey iyi çalışıyor. Bu uygulama katmanları (DataAccess, İş Mantığı ve UI) üzerine kurulmuştur.Gözlemlenebilir Toplama (Of T) vs BağlamaList (Of T)?

Public MustInherit Class BaseEntity 
    Inherits SerializableObject 
    Implements IEntity 
    Implements IComparer, _ 
       IEditableObject, _ 
       INotifyPropertyChanging, INotifyPropertyChanged, _ 
       IApplicationSecurity 
    End Class 

aynı çekirdek kütüphanesinde: Sekreterliği Açık Mantık için, bütün nesne aşağıdaki tanım (çerçeve elemanları ile birlikte, bazı özel amaçlar ve arabirimler bulunmaktadır) ile BaseEntity adı verilen bir temel sınıfından , BaseEntityCollection genel bir temel koleksiyonum var. Bu koleksiyon, her nesne için, veri tabanlı uygulamalarda, çok sıkı bir şekilde yazılmış, güçlü bir şekilde yazılan koleksiyonunu tanımlamamı sağlıyor. Burada baz tanımı aşağıda olduğu:

Public MustInherit Class BaseEntityCollection(Of T As BaseEntity) 
    Inherits BindingList(Of T) 
    Implements IEntityCollection 
    Implements INotifyPropertyChanged, INotifyPropertyChanging, ICopyable(Of T) 
    Implements IDisposable 
    Implements ISerializable 
    End Class 

Gördüğünüz gibi, ben Win doğru veri bağlama için ihtiyaç duyulan tüm malzeme kullanın: nesne için

  • INotifyPropertyChanged, INotifyPropertyChanging, IEditableObject.
  • Koleksiyonum için BindingList (Of T) temelli bir koleksiyon.

Ayrıca yeni teknolojilerle de tanıştım, bu yüzden kısa bir süre önce WPF ile ilgili bazı web yayınlarını izledim. Bu web yayınında, toplama ve veri bağlama desteği için GözlemlenebilirKoleksiyon (Of T) için temel sınıf olarak kullanılırlar.

Ben UI Katmanı için WPF için taşınamayacak üzerinde Win benim bazı uygulamaların düşünüyorum.

Sorum şu ki, iş mantığım için, koleksiyonlarımın BindingList (Of T) temelli olması daha iyi olur mu, yoksa temel koleksiyon sınıfımı, ObservableCollection (Of T) 'den miras alması için değiştirmeliyim. Tüm projelerim için Winforms Uygulamaları, WPF Uygulaması veya ASP.NET'te kullanılabilecek benzersiz bir temel koleksiyon tutmak istiyorum. Ayrıca projelerimde Nesneler için Linq kullanıyorum, bu yüzden projelerimi yalnızca çerçeve 2.0'a dayanarak kısıtlamıyorum.

sayesinde

Claber

cevap

13

Claber,

ben BindingList tutacak, BindingList daha arayüzleri ve ObservableCollection daha zengin daha özelliği destekleyen çünkü. Örneğin : ObservableCollection bunu yapmaz

  1. BindingList, T IList uygular.
  2. BindingList veri mekanizmalarını bağlayıcı yeni eklenen ürünü iptal için kullandığı ICancelAddNew arabirimini uygulayan (eğer DataGridView bir satır ekledikten sonra kaçmasını tıklandığında, sıra ortadan kalkacaktır).

WPF'ye kendim çok yeni geldim ve ObservableCollection'un belirli avantajlarını bilmiyorum.

Bu yardımcı olur umarım.

+0

'ObservableCollection' parçacığı güvenlidir, BindingList hakkında bilmiyorum. – Shimmy

+10

Bu doğru değil. Microsoft'un belgeleri, ObservableCollection'ın iş parçacığı güvenli olmadığını açıkça belirtir. http://msdn.microsoft.com/en-us/library/ms668604.aspx – kevindaub

+11

ObservableCollection Collection devralır ve Koleksiyon IList arabirimini uygulamak ETMEZ beri 1 ifadesi yanlıştır. –

13

Ben senin cevap gelmedi yatıyor düşünüyorum: http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

kısa olması için, ObservableCollection alt öğelerine değişikliklere dinlemiyor ama sadece olayları yerleştirin ve Kaldır.

Diğer tarafta BindingList, çocukları tarafından yükseltilen değişiklikleri ve güncellemeleri dinler. Ancak Bağlama listesinin değişiklik bildirimlerini yaymak için tüm çocuklarını dinlemesi gerektiğinden, daha fazla bellek yüklemesiyle sonuçlanır. Bu :)

--Bruno

+0

BindingList, koleksiyondaki bir öğenin değişmesi durumunda, BindingList öğesinin bu iletiyi kılavuza geçirmesi veya tek bir hücreyi veya değeri güncellemek için denetlemesi nedeniyle, koleksiyondaki her öğeyi dinler (sanırım çocuklar). Bu, tüm satırın değerlerinin yenilenmesine gerek olmadığı anlamına gelir. DataGridView'a özel, bir satırı değil bireysel bir hücreyi yenilerseniz, düzenlediğiniz satırda değişiklikleriniz gider. Sadece ihtiyaçlara bağlı. – TamusJRoyce

2

eski konuya benim iki sent ekleme yardımcı olacak

Umut:

zaman WinForms DataGridView bu jenerik koleksiyonlarından birini bağlayıcı verileri ve daha sonra güncelleme özellikleri Birden çok seçili satır için kaynak verilerinde, aşağıdakileri görürsünüz: ObservableCollection<T> yalnızca en son seçilenlerin hücre değerlerini güncelleyecektir Ted satır.

  • BindingList<T>, seçili tüm satırların hücre değerlerini güncelleyecektir. Her birinin avantajları ve dezavantajları olduğunu düşünüyorum, ancak yukarıdaki örnek bunun farkında olmayanlar için bir istek olabilir.