[英]How to make an ObservableCollection update when an item property is changed
[英]How to detect if an item in my ObservableCollection has changed
我有一個綁定到ObservableCollection<Product>
。 更新網格后,這會自動更新集合中的Product對象。
我現在要做的是在集合中的任何對象被更新時觸發某種甚至觸發 - 或者 - 某種類型的綁定到集合,如果任何產品已更新,它將返回true / false depedant。
總體目標是在我的主窗口上有一個保存按鈕,如果沒有對我的集合進行任何更改則禁用該按鈕,如果已進行了更改,則啟用該按鈕。
我已經閱讀了INotifyPropertyChange
但我沒有看到我如何使用它來監控整個集合的變化。
另外,如果我在Product類上實現此接口,我不會看到我的UI如何監視集合中的每個產品 - 或者它可以嗎?
Product
類中實現INotifyPropertyChanged
,並為每個屬性提供通知。 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<string> strings = new ObservableCollection<string>();
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.
}
邏輯需要進入您的Model(Product class)。 一種干凈的方法是在模型中公開IsDirty
屬性(由字段支持)。
並且您的ViewModel將使用CanSave
的Command綁定檢查內部集合,如果集合IsDirty=true
任何項目,則返回IsDirty=true
。
我認為為集合中的每個對象訂閱PropertyChanged
事件並觸發此事件,例如,在對象的setter中可以工作。
但是,我認為您不需要做所有這些來確定您的網格中是否更改了單元格。 我認為你可以做一些像他們在這里所做的事情:
http://social.msdn.microsoft.com/Forums/en/wpf/thread/81131225-90fb-40f9-a311-066952c7bc43
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.