2011-01-03 11 views
6

¿Alguien puede señalar un ejemplo donde se implementa CollectionChanged. Estoy usando wpf mvvm light. Intenté googlear, no encontré nada lo suficientemente bueno.CollectionChanged muestra

+0

Un poco más de detalle, por favor. ¿Que estás tratando de hacer? –

+0

Tengo una cuadrícula de datos con Objetos de colección observable que tiene habilitada la edición en línea, cuando el usuario termina de editar/agregar/eliminar los datos en esta cuadrícula de datos, quiero enviar esos datos al servicio web para su actualización. – WhoIsNinja

+1

No puedo creer que haya aceptado la respuesta de Arxisos a continuación ... el código siguiente no tiene sentido ... ¿Cómo implementar NotifyCollectionChanged y NotifyCollectionChangedEventArgs? Eche un vistazo aquí http://blog.stephencleary.com/2009/07/interpreting-notifycollectionchangedeve.html para una buena descripción breve y también hay enlaces a implementaciones y más detalles. – Beachwalker

Respuesta

9
public ObservableCollection<string> Names { get; set; } 

public ViewModel() 
{ 
    names = new ObservableCollection<string>(); 
    Names.CollectionChanged += this.OnCollectionChanged; 
} 

void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    //Get the sender observable collection 
    ObservableCollection<string> obsSender = sender as ObservableCollection<string>; 

    List<string> editedOrRemovedItems = new List<string>(); 
    foreach(string newItem in e.NewItems) 
    { 
     editedOrRemovedItems.Add(newItem); 
    } 

    foreach(string oldItem in e.OldItems) 
    { 
     editedOrRemovedItems.Add(oldItem); 
    } 

    //Get the action which raised the collection changed event 
    NotifyCollectionChangedAction action = e.Action; 
} 

Para obtener más información acerca de los NotifyCollectionChangedEventArgs vistazo here.

EDITAR: Debido a que necesita una lista de elementos añadidos/eliminados, modifiqué el código de muestra.

+0

por alguna razón, el método onCollectionChanged se invoca solo en el caso de agregar o quitar elementos. pero no en el caso de editar el elemento. También me gustaría saber cómo avanzar con esto, me refiero a cómo finalmente enviar la lista/colección de elementos recién agregados, eliminados y editados en una sola colección. Gracias. – WhoIsNinja

+0

Parece que tienes otra pregunta para publicar. –

+1

ObservableCollection no proporciona funciones para llamar a OnCollectionChanged en elementos de edición. Tienes que hacer eso tú mismo. Sus elementos en la colección deben implementar INotifyPropertyChanged y debe agregar detectores de eventos al evento PropertyChanged de INotifyPropertyChanged. Mire http://stackoverflow.com/questions/269073/observablecollection-that-also-monitors-changes-on-the-elements-in-collection para obtener más información. – Arxisos

1
public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 

    } 
    private ObservableCollection<Person> persons = new ObservableCollection<Person>(); 


    public MainWindow() 
    { 
     InitializeComponent(); 
     dgPerson.ItemsSource = persons; 
     persons.CollectionChanged += this.OnCollectionChanged; 
    } 


    void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     //Get the sender observable collection 
     ObservableCollection<Person> obsSender = sender as ObservableCollection<Person>; 
     NotifyCollectionChangedAction action = e.Action; 
     if (action == NotifyCollectionChangedAction.Add) 
      lblStatus.Content = "New person added"; 
     if (action == NotifyCollectionChangedAction.Remove) 
      lblStatus.Content = "Person deleted"; 
    } 
    private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     Person p = new Person(); 
     p.FirstName = txtFname.Text; 
     p.LastName = txtLname.Text; 

     persons.Add(p); 
    } 

A very simple complete example here