c# wpf wpfdatagrid inotifypropertychanged

c# - Cómo detectar si un artículo en mi ObservableCollection ha cambiado



uwp observablecollection (4)

Creo que la suscripción al evento PropertyChanged para cada uno de los objetos en su colección y la activación de este evento, por ejemplo, en el setter de sus objetos puede funcionar.

Sin embargo, creo que no es necesario hacer todo esto para averiguar si se cambia una celda en su cuadrícula. Creo que puedes hacer algo como lo que hacen aquí en su lugar:

http://social.msdn.microsoft.com/Forums/en/wpf/thread/81131225-90fb-40f9-a311-066952c7bc43

Tengo un datagrid que está vinculado a ObservableCollection<Product> . Cuando se actualiza la cuadrícula, esto actualiza automáticamente el objeto Producto en mi colección.

Lo que quiero hacer ahora es tener algún tipo de par que se active cuando se actualice cualquier objeto de la colección -o-- algún tipo de enlace a la colección que devolverá verdadero / falso dependiente si se ha actualizado algún Producto.

El objetivo general es tener un botón de guardar en mi ventana principal que esté deshabilitado si no se han realizado cambios en mi colección y se ha habilitado si se han hecho cambios.

He leído en INotifyPropertyChange pero no veo cómo puedo usar esto para monitorear los cambios en una colección completa.

Además, si implemento esta interfaz en mi clase de producto, no veo cómo mi interfaz de usuario puede monitorear cada producto de la colección, ¿o sí?


La lógica debe ir en su modelo (clase de producto). Un enfoque limpio sería exponer la propiedad IsDirty (respaldada por el campo) en su modelo.

Y su ViewModel tendría un enlace de Comando con CanSave revisando la colección interna, y devolvería verdadero si cualquiera de los elementos de la colección IsDirty=true .


Solo usa el ObservableCollection. Tiene un evento llamado CollectionChanged . Si lo registras, puedes hacer lo que quieras. Ejemplo:

ObservableCollection<string> strings = new ObservableCollection<string>(); strings.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(changed); strings.Add("Hello"); strings[0] = "HelloHello";

Y:

private void changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) { //You get notified here two times. }


  • Implemente INotifyPropertyChanged en su clase de Product con notificación para cada propiedad.
  • Implementa INotifyPropertyChanged en tu viewmodel.
  • Agregue la propiedad IsDirty a su ViewModel (con notificación a través de INotifyPropertyChanged .
  • En su modelo de vista, suscríbase a CollectionChanged

    public YourViewModel() { ... YourCollection.CollectionChanged += YourCollection_CollectionChanged; ... } private void YourCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) { if (args.OldItems != null) foreach(var oldItem in args.OldItems) oldItem.PropertyChanged -= YourItem_PropertyChanged; if (args.NewItems != null) foreach(var newItem in args.NewItems) newItem.PropertyChanged += YourItem_PropertyChanged; } private void Youritem_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs args) { IsDirty = true; }

  • Ahora puede enlazar a la propiedad IsDirty de su modelo de vista, por ejemplo, puede enlazar la propiedad Button.IsEnabled directamente a ella.