2012-01-24 21 views
16

Tengo una cuadrícula de datos que está vinculada a ObservableCollection<Product>. Cuando se actualiza la grilla, esto actualiza automáticamente el objeto Product en mi colección.Cómo detectar si un elemento en mi ObservableCollection ha cambiado

Lo que quiero hacer ahora es tener algún tipo de incluso que se active cuando se actualiza cualquier objeto en la colección -o bien - algún tipo de enlace a la colección que devolverá dependiente verdadero/falso si algún Producto tiene sido actualizado

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

He leído en INotifyPropertyChange pero no veo cómo puedo usar esto para controlar 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 controlar todos los productos de la colección, ¿o sí?

+1

Ver aquí: http: // stackoverflow.com/questions/1427471/observablecollection-not-noticing-when-item-in-it-changes-even-with-inotifyprop – SwDevMan81

+1

Estoy usando esto: http://stackoverflow.com/questions/8490533/notify-observablecollection -when-item-changes – Noich

Respuesta

1

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 comprobando la colección interna, y devolvería true si Cualquiera del elemento en la colección IsDirty=true.

2

sólo tiene que utilizar el ObservableCollection. Tiene un evento llamado CollectionChanged. Si lo registra, puede hacer lo que quiera. 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. 
} 
+24

A pesar de la documentación de MSDN, CollectionChanged no se invoca cuando cambian los objetos en la colección. Solo cuando la colección en sí tiene objetos agregados o eliminados. –

9
  • Implementar INotifyPropertyChanged en su clase Product con la notificación para cada propiedad.
  • Implemente INotifyPropertyChanged en su viewmodel.
  • añadir una propiedad IsDirty a su modelo de vista (con notificación por medio INotifyPropertyChanged.
  • En su modelo de vista, suscribirse 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 unirse a IsDirty propiedad de su modelo de vista, por ejemplo, puede vincular Button.IsEnabled propiedad directamente.

+0

Esto debería establecerse como la respuesta. – Oystein

Cuestiones relacionadas