2011-01-03 7 views
6

Czy ktoś może wskazać przykład, w którym zaimplementowano funkcję CollectionChanged. Używam światła wpf mvvm. Próbowałem google, nie znalazłem nic dobrego.KolekcjaZmieniona próbka

+0

Trochę więcej szczegółów, proszę. Co próbujesz zrobić? –

+0

Mam datagrid z obserwowalnym źródłem przedmiotów z włączoną edycją, po zakończeniu edycji/dodania/usunięcia danych z tego datagridu chcę wysłać te dane do serwisu internetowego w celu aktualizacji. – WhoIsNinja

+1

Nie mogę uwierzyć, że zaakceptowałeś odpowiedź Arxisos poniżej ... poniższy kod nie ma sensu ... W jaki sposób wdrożyć NotifyCollectionChanged i NotifyCollectionChangedEventArgs? Zajrzyj tutaj http://blog.stephencleary.com/2009/07/interpreting-notifycionlectlectchangedeve.html, aby uzyskać dobre krótkie opisy, a także linki do implementacji i dalsze szczegóły. – Beachwalker

Odpowiedz

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; 
} 

Aby uzyskać więcej informacji na temat NotifyCollectionChangedEventArgs wyglądać here.

EDYCJA: Ponieważ potrzebna jest lista dodanych/usuniętych elementów, zmodyfikowałem przykładowy kod.

+0

z jakiegoś powodu, metoda onCollectionChanged zostaje wywołana tylko w przypadku dodawania lub usuwania elementów. ale nie w przypadku elementu edycji. Chciałbym również wiedzieć, jak posunąć się naprzód, mam na myśli to, jak ostatecznie wysłać listę/kolekcję nowo dodanych, usuniętych i edytowanych przedmiotów w jednym zbiorze. Dzięki. – WhoIsNinja

+0

Wygląda na to, że masz kolejne pytanie do opublikowania. –

+1

ObservableCollection nie udostępnia funkcji do wywoływania funkcji OnCollectionChanged podczas edycji elementów. Musisz to zrobić sam. Twoje produkty w kolekcji muszą implementować INotifyPropertyChanged i musisz dodać detektory zdarzeń do zdarzenia PropertyChanged INotifyPropertyChanged. Spójrz na http://stackoverflow.com/questions/269073/observablecollection-that-also-monitors-changes-on--elements-in-collection, aby uzyskać więcej informacji. – 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

Powiązane problemy