2012-01-24 10 views
16

Mam datagrid, który jest związany z ObservableCollection<Product>. Kiedy siatka jest aktualizowana, automatycznie aktualizuje obiekt produktu w mojej kolekcji.Jak wykryć, czy element w mojej ObservableCollection zmienił się

Teraz chcę mieć coś w rodzaju wyzwolonego, gdy jakiś obiekt w zbiorze zostanie zaktualizowany - lub - jakiś rodzaj wiązania z kolekcją, która zwróci wartość true/false depedant, jeśli jakikolwiek produkt ma został zaktualizowany.

Ogólnym celem jest wyłączenie przycisku zapisu w moim głównym oknie, jeśli nie wprowadzono żadnych zmian w mojej kolekcji i włączono, jeśli zostały wprowadzone zmiany.

Przeczytałem w INotifyPropertyChange, ale nie widzę, jak mogę to wykorzystać do monitorowania zmian w całej kolekcji.

Dodatkowo, jeśli zaimplementuję ten interfejs w mojej klasie produktów, nie widzę, jak mój interfejs użytkownika może monitorować każdy produkt w kolekcji - czy może?

+1

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

+1

Używam tego: http://stackoverflow.com/questions/8490533/notify-observablecollection -when-item-changes – Noich

Odpowiedz

1

Logika musi być zgodna z modelem (klasa produktu). Czystym podejściem byłoby wyeksponowanie właściwości IsDirty (wspieranej przez pole) w modelu.

Twój model ViewModel będzie miał powiązanie Command z CanSave sprawdzając kolekcję wewnętrzną i zwróci true, jeśli którykolwiek z elementów w kolekcji IsDirty=true.

0

Myślę, że zasubskrybowanie zdarzenia PropertyChanged dla każdego obiektu w kolekcji i wystrzelenie tego zdarzenia, na przykład w ustawiaczu twoich obiektów, może działać.

Jednak myślę, że nie musisz robić tego wszystkiego, aby dowiedzieć się, czy komórka została zmieniona w twojej sieci. Myślę, że można zrobić coś takiego, co robią tutaj zamiast:

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

2

Wystarczy użyć ObservableCollection. Ma wydarzenie o nazwie CollectionChanged. Jeśli ją zarejestrujesz, możesz zrobić to, co chcesz. Przykład:

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

I:

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

Pomimo dokumentacji MSDN, CollectionChanged nie jest wywoływana, gdy zmieniają się obiekty w kolekcji. Tylko wtedy, gdy sam Collectoin ma dodane lub usunięte obiekty. –

9
  • Wdrożenie INotifyPropertyChanged w swojej klasie Product z powiadomienia dla każdej nieruchomości.
  • Implementacja INotifyPropertyChanged w swoim modelu wyświetlania.
  • Dodaj właściwość IsDirty do ViewModel (z notyfikacji przez INotifyPropertyChanged.
  • W swojej viewmodel, zapisz się 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; 
    } 
    
  • Teraz można wiązać IsDirty własności swojej viewmodel, na przykład, można powiązać własność bezpośrednio z nią:

+0

To powinno być ustawione jako odpowiedź. – Oystein

Powiązane problemy