2009-03-17 7 views
12

Mam niestandardową klasę Foo z właściwościami A i B. Chcę wyświetlić ją w formancie kontroli danych.Jak wykryć zmiany we właściwościach elementu BindingList <T>?

Utworzyłem klasę Foos : BindingList<Foo>.

Aby zaktualizować niektóre wewnętrzne właściwości klasy Foos, należy powiadomić o zmianach właściwości (mogę obsłużyć wstawienia, usunięcia itp.) Na pozycje na liście. Jak wdrożysz tę funkcjonalność?

Czy powinienem dziedziczyć Foo z jakiegoś obiektu w ramach, który obsługuje to? Myślę, że mógłbym tworzyć wydarzenia, które powiadamiałyby mnie o zmianach, ale czy tak powinien być zrobiony? Czy jest jakiś wzór w ramach, który by mi pomógł?

Odpowiedz

19

Foo powinien implementować interfejsy INotifyPropertyChanged i INotifyPropertyChanging.

public void Foo : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    private int _someValue; 
    public int SomeValue 
    { 
     get { return _someValue; } 
     set { _someValue = value; NotifyPropertyChanged("SomeValue"); } 
    } 
} 

BindingList powinien zahaczyć obsługi zdarzenia automagicznie, a GUI powinien aktualizować whever ustawić klasa wywołuje obsługi zdarzeń PropertyChanged.

[Edytuj, aby dodać:] Dodatkowo klasa BindingList exposted two events który powiadamiania kolekcja została dodana lub zmodyfikowana:

public void DoSomething() 
{ 
    BindingList<Foo> foos = getBindingList(); 
    foos.ListChanged += HandleFooChanged; 
} 

void HandleFooChanged(object sender, ListChangedEventArgs e) 
{ 
    MessageBox.Show(e.ListChangedType.ToString()); 
} 
+0

Testowanie ... myślę, że to jest to, czego szukam. –

+0

Jakie wydarzenie w klasie Foos złapie Fire PropertyChanged handlers? Pamiętaj, że potrzebuję trochę pracy w klasie Foos (w zasadzie przerabiając niektóre wewnętrzne słowniki). –

+0

Powiedzmy, że twoja klasa Foo została zaimplementowana w taki sam sposób, jak pokazano powyżej. Gdy dowolna klasa ustawia właściwość Foo.SomeValue, instancja Foo podnosi procedurę obsługi zdarzenia PropertyChanged. Możesz (jeśli chcesz) podłączyć się do tej obsługi zdarzeń bezpośrednio w instancji Foo lub poprzez BindingList.ListChanged. – Juliet