2010-12-21 16 views
12

tengo una colección observable ... ..Y SelectableDataContext<T> en la clase genérica SelectableDataContext<T> es ... tener dos variables miembro privadaslo que es notifycollectionchangedaction restablecer el valor

  1. artículo T privada.
  2. Bool privado isSelected.

Cuando la propiedad IsSelected cambia ... La propiedad modificada de mi colección no se activa.

Creo que debería disparar ... porque es Reset en INotifyCollectionChangedAction.

Respuesta

0

Se cambiará la colección si y solo si modifica la colección mediante Adición de un nuevo elemento o Eliminación de un elemento existente de la colección.

2

Hay una diferencia entre INotifyCollectionChanged y INotifyPropertyChanged.

Cuando cambia el valor de una propiedad en un objeto, debe notificar a los demás mediante la implementación de la interfaz INotifyPropertyChanged.

Por otro lado, cuando number of items o items themselves cambian en una colección, debe informar a los demás mediante la implementación INotifyCollectionChanged.

Ahora, en su caso, cambia el valor de una propiedad de un objeto en su colección. Se supone que esto eleva el evento PropertyChanged, no el evento CollectionChanged.

+1

¿Qué es entonces RESET? – Relativity

26

Ésta es una cuestión de edad, sino en beneficio de cualquier persona que pueda venir a través de esto a través de una búsqueda como lo hice:

NotifyCollectionChangedAction.Reset significa "El contenido de la colección cambió drásticamente". Un caso en el que se plantea el evento Restablecer es cuando llama al Clear() en la colección observable subyacente.

Con el evento Restablecer, no obtiene las colecciones NewItems y OldItems en el parámetro NotifyCollectionChangedEventArgs.

Esto significa que es mejor utilizar el "remitente" del evento para obtener una referencia de la colección modificada y usarla directamente, es decir, asumir que es una nueva lista.

Un ejemplo de esto podría ser algo como:

((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; 
    } 
} 

Un montón de discusiones sobre este evento aquí: Restablecer When Clearing an ObservableCollection, There are No Items in e.OldItems.

Cuestiones relacionadas