How to detect if an item in my ObservableCollection has changed
- Implement
INotifyPropertyChanged
in yourProduct
class with notification for every property. - Implement
INotifyPropertyChanged
in your viewmodel. - Add property
IsDirty
to your ViewModel (with notification throughINotifyPropertyChanged
. In your viewmodel, subscribe to
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;}
Now you can bind to
IsDirty
property of your viewmodel, for example, you can bindButton.IsEnabled
property directly to it.
Just use the ObservableCollection.It has an event called CollectionChanged. If you register it, you can do what you want. Example:
ObservableCollection<string> strings = new ObservableCollection<string>();strings.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(changed);strings.Add("Hello");strings[0] = "HelloHello";
And:
private void changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args){ //You get notified here two times.}
The logic needs to go in your Model (Product class).A clean approach would be to expose IsDirty
property (backed by field) in your model.
And your ViewModel would have a Command binding with CanSave
checking the internal collection, and return true if Any of the item in collection IsDirty=true
.