2010-12-21 623 views
12

mam dostrzegalnych kolekcji ... SelectableDataContext<T> ..i w klasie rodzajowy SelectableDataContext<T> jest ... posiadanie dwóch prywatnych zmiennych składowychco jest notifycollectionchangedaction zresetować wartość

  1. Private artykuł T.
  2. Prywatny bool jest wybrany.

Po zmianie właściwości IsSelected ... Zmieniona właściwość mojej kolekcji nie jest uruchamiana.

Myślę, że powinien wystrzelić ... ponieważ jest to Reset w INotifyCollectionChangedAction.

Odpowiedz

0

Zmieniona kolekcja zostanie uruchomiona wtedy i tylko wtedy, gdy zmodyfikuje się kolekcję za pomocą dodania nowego elementu lub usunięcia istniejącego elementu z kolekcji.

2

Istnieje różnica między INotifyCollectionChanged i INotifyPropertyChanged.

Po zmianie wartości obiektu w obiekcie należy powiadomić innych za pomocą implementacji interfejsu INotifyPropertyChanged.

Z drugiej strony, gdy number of items lub items themselves zmienić w kolekcji, powinien dać znać innym za pomocą implementacji INotifyCollectionChanged.

Teraz, w twoim przypadku, zmienia się wartość właściwości obiektu w twojej kolekcji. To ma podnieść wydarzenie PropertyChanged, a nie CollectionChanged.

+1

Ale czym jest RESET? – Relativity

26

To stara sprawa, ale z korzyścią dla każdego, kto może natknąć się to poprzez poszukiwanie jak ja:

NotifyCollectionChangedAction.Reset oznacza „Zawartość kolekcji zmieniła się dramatycznie”. Jeden przypadek, w którym podniesiono zdarzenie Reset, ma miejsce, gdy wywołuje się Clear() w podstawowej obserwowalnej kolekcji.

W przypadku zdarzenia Resetowanie nie są pobierane kolekcje NewItems i OldItems w parametrze NotifyCollectionChangedEventArgs.

Oznacza to, że lepiej jest użyć "nadawcy" zdarzenia, aby uzyskać odniesienie do zmodyfikowanego zbioru i użyć go bezpośrednio, tj. Założyć, że jest to nowa lista.

Przykładem tego może być coś takiego:

((INotifyCollectionChanged)stringCollection).CollectionChanged += new NotifyCollectionChangedEventHandler(StringCollection_CollectionChanged); 
    ... 

void StringCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    switch (e.Action) 
    { 
     case NotifyCollectionChangedAction.Add: 
      foreach (string s in e.NewItems) 
      { 
       InternalAdd(s); 
      } 
      break; 

     case NotifyCollectionChangedAction.Remove: 
      foreach (string s in e.OldItems) 
      { 
       InternalRemove(s); 
      } 
      break; 

     case NotifyCollectionChangedAction.Reset: 
      ReadOnlyObservableCollection<string> col = sender as ReadOnlyObservableCollection<string>; 
      InternalClearAll(); 
      if (col != null) 
      { 
       foreach (string s in col) 
       { 
        InternalAdd(s); 
       } 
      } 
      break; 
    } 
} 

Wiele dyskusji na ten reset imprezy tutaj: When Clearing an ObservableCollection, There are No Items in e.OldItems.