簡體   English   中英

ObservableCollection:在更新值時引發事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM