I have a datagrid which is bound to ObservableCollection<Product>
. When the grid is updated this automatically updates the Product object in my collection.
What I want to do now is to have some sort of even that is triggered when any object in the collection is updated -or- some sort of binding to the collection that will return true/false depedant on if any Product has been updated.
The overall objective is to have a save button on my main window that is disabled if no changes have been made to my collection and enabled if changes have been made.
I have read into INotifyPropertyChange
but I dont see how I can use this to monitor changes on a whole collection.
Additionally, if I implement this interface on my Product class I dont see how my UI can monitor every product in the collection - or can 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
.
I think subscribing to the PropertyChanged
event for each of the objects in your collection and firing this event, for example, in the setter of your objects can work.
However, I think you don't need to do all this to figure out if a cell is changed in your grid. I think you can do something like what they do here instead:
http://social.msdn.microsoft.com/Forums/en/wpf/thread/81131225-90fb-40f9-a311-066952c7bc43