Zacznijmy od tego, że
Aby móc przypisywać do właściwości DataSource kontrolki zaimplementowałem przez moją klasę reprezentującą kolekcję interfejs IListSource
jest mylące. Obiekt podawany do .DataSource nie musi implementowac IListSource. Na dobrą sprawę, mało co musi implementować. Zwykle posiadanie jakichś property albo wystawianie interfejsu IList jest wystarczające do prostego przerzucenia danych - ostatecznie wiekszosc kontrolek poza .DataSource ma również .DataMember, a gdzie to nie wystarcza to można posłać obiekt BindingSource albo BindingList<TItem>. Sprawa sie komplikuje gdy faktycznie chcesz napisac swoj kontener z jakiegos powodu... i w związku z tym:
trzy słowa o idei IListSource, którego probujesz użyć:
Kontrolka posiadająca "jej.DataSource = twojClass1", w momencie wykrycia ze tenże Twoj obiekt implementuje IListSource przestaje go postrzegac jako sensu stricte DataSource i zaczyna sadzic ze jest on raczej tak jakby 'źródłem źródła danych'. Toteż wywola .GetList tylko raz, to co od niego dostenie zapamięta i odtąd będzie używać owego otrzymanego obiektu listy, przynjamniej dopoki nie zmienisz jej .DataSource kiedy to oczywiscie znowu przeladuej wszystko. I na tym koniec interakcji przez IListSource. Źródło wygenerowało właściwa kolekcje danych i wszyscy są happy. (Możliwe, że właśnie taki efekt chciałes uzyskać, ale sądzę że raczej chciales miec klase reprezentujaca kolekcje i chcialbys żeby obiekty tej klasy funkcjonowaly jako zrodla danych.) Problem polega na tym, ze liczy się, jakie interfejsy implementuje ta OSTATECZNA lista. To ona ma za zadanie powiadamiać, że uległa zmianie. Czasami nazywa się to implementowaniem 'IListChanged', acz to trochę nie tak:) U ciebie jest to IList, czyli totalnie głupia lista. Jesli chcialbys teraz sytuacje naprawic, to ta drobna lista zwracana musialaby byc wymieniona na cos bardziej skomplikowanego, np. na BindingList<Unit> -- i to pewnie natychmiast zadziala i grid bedzie sie odswiezal jak tylko dodasz nowe elementy.
Ale proszę, zanim zaczniesz dalej kombinowac, zapoznaj się z całym artykułem (który defacto czasem ciężko znaleźć, a jest BARDZO pożyteczny):
Wyjaśnienie interfejsów używanych przy DataBindingu w .Net
sądzę, że pomoże on Ci złapać, czego oczekuje się od Twoich klas które maja byc ładnymi źrodłami danych.
wyciąg ze środka, na potwierdzenie:
- IListSource interface
A class that implements the IListSource interface enables list-based binding on non-list objects. The GetList method of IListSource is used to return a bindable list from an object that does not inherit from IList. IListSource is used by the DataSet class.
Co w skrócie mówi, że zamieniłeś sobie problem bycia bindowalną listą, na problem dostarczenia bindowalnej listy, czyli samo IListSource na razie mało Ci dało :) [Acz coś dało, bo teraz możesz użyć BindingList<>!]
a osobiście polecam interfejs: IBindingList który jest jednym z najlepszych sposobów (=rozumiany przez najwieszą liczbę kontrolek/komponentów) na powiedzenie innym, że jest się listą która może się zmieniać. Zwróc też uwagę, że do informowania o zmianach we własnościach elementu listy jest INotifyPropertyChanged i to element listy powinien go implementować, nie lista. Lista się nie zmieła - oszczedzasz na przeladowaniu calej listy, ktore odbylo by sie gdyby o tym powiadamiac przez ListChanged.
Jak nazwa wskazuje, wspomniana klasa S.W.F.BindingList<TItem> jest wlasnie domyslna implementacja IBindingList.