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