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 deProduct
con notificación para cada propiedad. - Implementa
INotifyPropertyChanged
en tu viewmodel. - Agregue la propiedad
IsDirty
a su ViewModel (con notificación a través deINotifyPropertyChanged
. 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 propiedadButton.IsEnabled
directamente a ella.