簡體   English   中英

ObservableCollection CollectionChanged事件的問題

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

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