[英]Prolems with ObservableCollection CollectionChanged event
我有一個ObservableCollection _cableList
其中包含CableViewModel
類型的CableViewModel
。 CableViewModel
對象具有布爾屬性IsInDB
,如果在另一個集合中列出了另一個屬性Type
,則應設置該屬性。 我聽PropertyChanged
事件以更新IsInDB
屬性。 這可以按預期工作,但是我還需要為添加到集合中的項目更新IsInDB
屬性。 我嘗試使用以下代碼解決此問題:
public MainViewModel()
{
_cableList = new ObservableCollection<CableViewModel>();
_cableList.CollectionChanged += _cableListChanged;
}
private void _cableListChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if(e.OldItems != null)
{
foreach (INotifyPropertyChanged item in e.OldItems)
item.PropertyChanged -= cablePropertyChanged;
}
if(e.NewItems != null)
{
foreach (INotifyPropertyChanged item in e.NewItems)
{
item.PropertyChanged += cablePropertyChanged;
// This causes an exception
MessageBox.Show("Collection changed - new Item");
var x = (CableViewModel)item;
x.IsInDB = IsInCableDB(x.Type);
}
}
}
該代碼導致System.InvalidOperationException
類似“ ItemsControl
與它的對象源不一致”之類的信息,或者至少是我試圖從瑞典語錯誤消息中進行翻譯。
我的代碼有什么問題? 還有另一種解決任務的方法嗎?
編輯
我沒有在原始帖子中顯示完整的代碼,因為我認為它與異常無關。 但是我錯了。
在我的原始帖子中,我沒有顯示或提及我顯示了用於調試目的的MessageBox
。 每次向集合添加新對象時都會顯示該對象。 現在,上面的代碼已被編輯,因此包括MessageBox.Show
行。 在這里發布原始消息后,我從代碼中刪除了MessageBox
,結果異常消失了。 MessageBox
是否導致UI與集合不同步? ( ObservableCollection
綁定到DataGrid
)
在那種情況下,我建議使用ReactiveList並使用observables代替事件-這樣可以避免很多線程問題。
從好的方面來說,您可以執行以下操作:
_cableList.ItemChanged.Where(x => x.PropertyName == "Cable").Select(x => x.Sender).Subscribe(x => {
//do something with the object
});
_cableList.ItemsAdded.Subscribe(x => x.IsInDB = IsInCableDB(x.Type);
嗯...我的錯。 在編寫代碼時,我添加了消息框以了解發生了什么。 每次觸發CollectionChanged
時,都會顯示一個消息框。 當我刪除消息框時,異常消失了。 消息框是否導致UI與數據不同步?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.