2012-04-20 17 views
6

Estoy confundido acerca de cómo funciona ObservableCollection y INotifyPropertyChanged.¿Cuál es la diferencia entre ObservableCollection e INotifyPropertyChanged?

tengo este código:

Payments = new ObservableCollection<PaymentViewModel>(_allPayments); 

public ObservableCollection<PaymentViewModel> Payments 
{ 
    get { return _payments; } 
    set { 
     _payments = value; 
     RaisePropertyChanged("Payments"); 
    } 
} 

que no entienden lo que es la relación entre ObservableCollection y INotifyPropertyChanged aquí. ¿Puedes explicar?

Respuesta

6

ObservableCollection es una colección especializada que puede notificar a los suscriptores cuando sus contenidos de cambio, mientras que INotifyPropertyChanged es una interfaz que permite a los implementadores a notificar a los suscriptores cuando uno de sus propiedades valor cambios.

Probablemente se esté preguntando cómo se relacionan los dos (porque ambos están "involucrados" en el escenario en su ejemplo).

consideran este código:

var model = new MyViewModel(); // assume it's the class with Payments inside 
model.Payments.Add(new PaymentViewModel()); 

Los abonados al evento INotifyCollectionChanged.CollectionChanged que ahora sabemos que las cosas han cambiado y que debe actualizar en consecuencia.

Pero ahora un vistazo a esto:

var model = new MyViewModel(); // assume it's the class with Payments inside 
model.Payments.Add(new PaymentViewModel()); // OK, we know what this does 

model.Payments = new ObservableCollection<PaymentViewModel>(); 

Después de añadir un elemento a la colección que luego intercambio de toda la colección por otro. Si un ItemsControl está vinculado a esta colección, esperamos que se actualice y refleje el hecho de que model.Payments termina siendo vacío. Pero, ¿cómo puede hacer eso?

CollectionChanged no ayudará porque la colección original (después de recibir su primer elemento) no se modificó; simplemente lo descartamos e instalamos otro en su lugar. El único que sabe que el cambio sucedió es el establecimiento de propiedades Payments. Entonces el colocador utiliza INotifyPropertyChanged para decirle a los suscriptores que la colección ha sido reemplazada por otra, y por supuesto deben actualizar su estado.

Conclusión: obras de enlace de datos automagicamente en WPF porque todos los controles de enlace de datos escuchan la INotifyPropertyChanged de su DataContext, y si el destino de enlace implementa INotifyCollectionChanged se suscriban a eso también. Si el objetivo vinculante cambia, se les notificará a través del INotifyPropertyChanged, darse de baja de INotifyCollectionChanged en el objetivo anterior y suscribirse a él en el nuevo.

2

ObservableCollection notifica su carpeta, por ejemplo, cuando se agrega/elimina algo a la colección.

Lo que está haciendo en el segundo ejemplo, sin embargo, es notificar al archivador que la colección ha sido reemplazada por una nueva colección (algo que el ObservableCollection no hace por sí mismo; si hace un nuevo ObservableCollection, pierde el enlace))

+0

también entiendo su respuesta. También da una buena respuesta. Gracias. – pratikjgandhi

Cuestiones relacionadas