如何检测我的ObservableCollection中的项是否已更改
我有一个绑定到ObservableCollection
。 更新网格后,这会自动更新集合中的Product对象。
我现在要做的是在集合中的任何对象被更新时触发某种甚至触发 – 或者 – 某种类型的绑定到集合,如果任何产品已经更新,它将返回真/假的depedant。
总体目标是在我的主窗口上有一个保存按钮,如果没有对我的集合进行任何更改,则该按钮被禁用,如果已经进行了更改,则启用该按钮。
我已经阅读了INotifyPropertyChange
但我没有看到我如何使用它来监控整个集合的变化。
另外,如果我在我的Product类上实现这个接口,我不会看到我的UI如何监视集合中的每个产品 – 或者它可以吗?
- 在
Product
类中实现INotifyPropertyChanged
,并为每个属性提供通知。 - 在viewmodel中实现
INotifyPropertyChanged
。 - 将属性
IsDirty
添加到ViewModel(通过INotifyPropertyChanged
通知。 -
在您的viewmodel中,订阅
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; }
-
现在您可以绑定到viewmodel的
IsDirty
属性,例如,您可以将Button.IsEnabled
属性直接绑定到它。
只需使用ObservableCollection。 它有一个名为CollectionChanged的事件。 如果你注册它,你可以做你想要的。 例:
ObservableCollection strings = new ObservableCollection (); strings.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(changed); strings.Add("Hello"); strings[0] = "HelloHello";
和:
private void changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) { //You get notified here two times. }
逻辑需要进入您的模型(产品类)。 一种干净的方法是在模型中公开IsDirty
属性(由字段支持)。
并且您的ViewModel将使用CanSave
的Command绑定检查内部集合,如果集合中的任何项目IsDirty=true
,则返回IsDirty=true
。
我认为为集合中的每个对象订阅PropertyChanged
事件并触发此事件,例如,在对象的setter中可以工作。
但是,我认为您不需要做所有这些来确定您的网格中是否更改了单元格。 我认为你可以做类似他们在这里做的事情:
http://social.msdn.microsoft.com/Forums/en/wpf/thread/81131225-90fb-40f9-a311-066952c7bc43