List <T> vs BindingList <T> Zalety / wady

93

Czy ktoś może opisać, jaka jest różnica między nimi w moim projekcie.

Obecnie mam List<MyClass>i ustawię BindingSource na to i DataGridView na BindingSource.

Zaimplementowałem, IEditableObjectwięc gdy wywoływana jest CancelEdit, przywracam obiekt z powrotem do tego, co był z plikiemMemberwise.Clone()

Czy zmiana mojej listy na BindingList rozwiąże którykolwiek z tych problemów i jakie są zalety korzystania z BindingList?

Jon
źródło

Odpowiedzi:

124

A List<>to po prostu tablica automatycznie zmieniająca rozmiar, zawierająca elementy danego typu, z kilkoma funkcjami pomocniczymi (np. Sort). To tylko dane i prawdopodobnie użyjesz ich do wykonywania operacji na zestawie obiektów w modelu.

A BindingList<>to opakowanie wokół wpisanej listy lub kolekcji, która implementuje IBindingListinterfejs. Jest to jeden ze standardowych interfejsów obsługujących dwukierunkowe wiązanie danych. Działa poprzez implementację ListChangedzdarzenia, które jest wywoływane podczas dodawania, usuwania lub ustawiania elementów. Powiązane kontrolki nasłuchują tego zdarzenia, aby wiedzieć, kiedy odświeżyć swój wyświetlacz.

Po ustawieniu źródła danych BindingSource na a List<>, wewnętrznie tworzy on, BindingList<>aby zawinąć listę. Możesz chcieć wstępnie zawinąć listę BindingList<>sobą, jeśli chcesz uzyskać do niej dostęp poza BindingSource, ale poza tym jest tak samo. Możesz również dziedziczyć z, BindingList<>aby zaimplementować specjalne zachowanie podczas zmiany elementów.

IEditableObjectjest obsługiwany przez BindingSource. Wywoła BeginEdit na dowolnym obiekcie implementującym, gdy zmienisz dane w dowolnej powiązanej kontrolce. Następnie możesz wywołać EndEdit / CancelEdit na BindingSource i przekaże go do twojego obiektu. Przejście do innego wiersza spowoduje również wywołanie EndEdit.

Alex J
źródło
Obecnie z moim podejściem List <T> wywołanie CancelEdit nie przywróci edytowanego elementu z powrotem do jego pierwotnego stanu, dlatego używam Clone (). Mówisz, że lista bindów załatwi to za mnie?
Jon
3
Nie, BindingList nie ma nic wspólnego z tą funkcją. BindingSource po prostu wywołuje CancelEdit w bieżącym obiekcie, niezależnie od typu podstawowej listy. W strukturze nie ma niczego, co automatycznie implementuje przechowywanie wersji obiektów dla zwykłych obiektów. Możesz użyć DataTables / DataRows, które przechowują oryginalną kopię danych tylko w tym celu.
Alex J
Mówisz, że kontrolki muszą wiedzieć, kiedy lista się zmienia, czy możesz wyjaśnić dalej? Mam formularz z datagridview, a następnie inny formularz z wypełnionymi danymi. Czy muszę się martwić, co mówisz w tej sprawie?
Jon
Na przykład DataGrid musi wiedzieć, kiedy elementy są dodawane do listy, aby dodać nowy wiersz. W tym celu używa zdarzenia ListChanged BindingList. Gdybyś wiązał siatkę bezpośrednio z List <T>, nie miałbyś zdarzenia, a siatka nie byłaby w stanie wiedzieć, kiedy zmieniłeś listę. Nie musisz się tym martwić w swoim scenariuszu, ponieważ BindingSource opakowuje List <T> w BindingList. Dopóki pracujesz z BindingSource, a nie z samą listą, kontrolki pozostaną zsynchronizowane.
Alex J
Czy istnieje obejście, aby użyć BindingList do interfejsu użytkownika WPF (sposób mvvm)? Czy mogę zawinąć listę bindowania w obserwowalną kolekcję?
Lance
13

BindingList umożliwia dwukierunkowe wiązanie danych przy użyciu zdarzeń, a List nie uruchamia zdarzeń, gdy zmienia się jego kolekcja.

Nie sądzę, że rozwiąże to twój konkretny problem.

Gerrie Schenck
źródło