2009-01-18 16 views
22

Opracowałem kilka aplikacji WinForm opartych na danych w ciągu ostatnich dwóch lat i wszystko działa dobrze. Ta aplikacja jest zbudowana na warstwach (DataAccess, Business Logic i UI). Dla businness Logic, wszystkie moje obiekty dziedziczą z klasy bazowej o nazwie BaseEntity z poniższej definicji (istnieją pewne obiekty niestandardowe i interfejsy, w połączeniu z elementami ramowymi):ObservableCollection (Of T) vs BindingList (Of T)?

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

w tej samej bibliotece rdzenia Mam ogólną kolekcję bazową BaseEntityCollection. Kolekcja ta pozwala mi zdefiniować dla każdego obiektu jego powiązaną kolekcję o silnym typie, która jest bardzo interesująca w aplikacjach opartych na danych. Tutaj jest to definicja podstawa:

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 

Jak widać, używam wszystkie rzeczy, które są potrzebne do prawidłowego wiązania z danymi w WinForm:

  • INotifyPropertyChanged, INotifyPropertyChanging, IEditableObject dla obiektu.
  • Kolekcja oparta na BindingList (Of T) dla mojej kolekcji.

Jestem również zainteresowany nowymi technologiami, więc ostatnio obejrzałem trochę webcastu na temat WPF. W tym webcastu używają one jako klasy bazowej do obsługi zbierania i wiązania danych ObservableCollection (Of T).

Myślę o migracji niektórych moich aplikacji z WinForm do WPF dla warstwy interfejsu użytkownika.

Moje pytanie brzmi, dla mojej logiki biznesowej, czy lepiej utrzymywać moje kolekcje w oparciu o BindingList (Of T), czy też powinienem zmienić swoją podstawową klasę kolekcji, aby dziedziczyła z ObservableCollection (Of T). Chciałabym zachować unikalną kolekcję bazową dla wszystkich moich projektów, która może być używana również w aplikacjach WinForm, WPF lub ASP.NET. Używam także Linq to Objects w moich projektach, więc nie mam ograniczeń, utrzymując moje projekty w oparciu o tylko framework 2.0.

Dzięki,

CLABER

Odpowiedz

13

CLABER,

chciałbym zachować BindingList, ponieważ BindingList obsługuje więcej interfejsów i bardziej funkcjonalny niż ObservableCollection. Na przykład

  1. BindingList realizuje IList na T, a ObservableCollection nie.
  2. BindingList implementuje interfejs ICancelAddNew używany przez mechanizmy wiążące dane do anulowania nowo dodanego elementu (po kliknięciu przycisku escape po dodaniu wiersza do DataGridView rząd zniknie).

Sam jestem nowy w WPF i nie znam konkretnych zalet oferowanych przez ObservableCollection.

Mam nadzieję, że to pomoże.

+0

'ObservableCollection' jest bezpieczna dla wątków, nie wiem o BindingList. – Shimmy

+10

To nie jest poprawne. Dokumentacja Microsoft wyraźnie stwierdza, że ​​ObservableCollection nie jest bezpieczna dla wątków. http://msdn.microsoft.com/en-us/library/ms668604.aspx – kevindaub

+11

1-cia stwierdzenie jest błędne ponieważ ObservableCollection dziedziczy Collection Kolekcja i implementuje IList interfejs. –

13

Myślę, że odpowiedź leży tam: http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

W skrócie, ObservableCollection nie słucha zmiany swoich dzieci, ale tylko do zakładania i zdejmowania wydarzenia.

Po drugiej stronie BindingList słucha zmian i aktualizacji podniesionych przez jego dzieci. Ale ponieważ lista Wiążąca musi słuchać wszystkich swoich dzieci, aby propagować powiadomienia o zmianach, powoduje to więcej obciążenia pamięci.

nadzieję, że pomoże :)

--Bruno

+0

BindingList nasłuchuje na każdym elemencie (to jest, jak sądzę, dzieci?) W kolekcji, ponieważ jeśli element w kolekcji zmienia się, to BindingList przekazuje tę wiadomość do siatki lub kontrolki, aby zaktualizować tę pojedynczą komórkę lub wartość. Oznacza to, że cały wiersz nie potrzebuje odświeżonych wartości. Specyficzne dla DataGridView, jeśli odświeżasz wiersz, a nie pojedynczą komórkę, w wierszu, który edytujesz, twoje zmiany znikną. To zależy od twoich potrzeb. – TamusJRoyce

2

Dodawanie moje dwa centy do starszej tematu:

podczas wiązania zarówno tych ogólnych zbiorów do WinForms DataGridView danych i właściwości następnie aktualizowanie w danych źródłowych dla wielu wybranych wierszy zobaczysz:

  1. Zaktualizuje tylko wartości komórek ostatnio wybranych w rzędzie.
  2. Numer BindingList<T> zaktualizuje wartości komórek wszystkich wybranych wierszy.

Myślę, że każdy z nich ma swoje wady i zalety, ale powyższy przykład może być dla tych, którzy nie zdają sobie z tego sprawy.

Powiązane problemy