![](/img/trans.png)
[英]Raising event when Property in ObservableCollection changes
[英]ObservableCollection: raising event when updating values
“在添加,刪除, 更改 ,移動或刷新整個列表時發生。” 這是用MSDN編寫的,談論的是CollectionChanged事件……但是……“已更改”是什么意思?
我有一個observableCollection。 它是從db填充的,並已綁定到我的視圖中(我正在使用mvvm模式)。
因此,我認為:“好吧,從我的角度來看,我編輯了與observableCollection綁定的字段”。 通過調試,我看到字段已更新,但是...事件未觸發...為什么?
msdn表示“已更改”是什么意思? 並且,如果這種方式是錯誤的,當observablecollection的值以我之前解釋的方式更新時,如何觸發我的動作?
在這種情況下,更改意味着將某個索引處的項目替換為另一個項目,而不更改現有項目。 更改集合中的項目不是集合中的更改,在一般情況下也沒有觀察這種變化的方法。
您將INotifyCollectionChanged
接口與INotifyPropertyChanged
接口混淆了。 聽起來您想知道集合中任何項目的任何屬性何時更改。 為了實現這一點,您將需要在數據類型類中實現INotifyPropertyChanged
接口,並將處理程序附加到INotifyPropertyChanged.PropertyChanged
事件:
item.PropertyChanged += Item_PropertyChanged;
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// The 'e.PropertyName' property changed
}
您可以通過擴展ObservableCollection<YourDataType>
類並將此代碼添加到該類中來進一步改善此情況:
public new void Add(T item)
{
item.PropertyChanged += Item_PropertyChanged;
base.Add(item);
}
...
public new bool Remove(T item)
{
if (item == null) return false;
item.PropertyChanged -= Item_PropertyChanged;
return base.Remove(item);
}
還有其他方法應該以這種方式覆蓋,但是一旦有了,就可以讓該類為您完成所有工作……如果將其放入某種通用基類中,則更好。 如果使該類也實現INotifyPropertyChanged
接口,則為了方便起見,您還可以“轉發”所有屬性更改:
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
NotifyPropertyChanged(e.PropertyName);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.