我有一个ObservableCollection和一个使用OC作为源的ICollectionView:
private ObservableCollection<Comment> _Comments = new ObservableCollection<Comment>();
/// <summary>
/// Comments on the account
/// </summary>
[BsonElement("comments")]
public ObservableCollection<Comment> Comments
{
get
{
return _Comments;
}
set
{
_Comments = value;
OnPropertyChanged("Comments");
OnPropertyChanged("CommentsSorted");
}
}
private ICollectionView _CommentsSorted;
/// <summary>
/// Sorted list (reverse order) of the comments
/// </summary>
[BsonIgnore]
public ICollectionView CommentsSorted
{
get
{
return _CommentsSorted;
}
set
{
_CommentsSorted = value;
OnPropertyChanged("CommentsSorted");
}
}
我有一个运行的命令:
obj.Comments.Add(new Comment(Message));
其中obj是包含可观察集合的类的实例。
呼叫此行时,出现以下异常:
System.NotSupportedException:'此CollectionView类型不支持从与Dispatcher线程不同的线程对其SourceCollection进行更改。'
我打开了“调试”>“ Windows”>“线程”面板,它在主线程上运行。我尝试将其放入App.Current.Dispatcher.Invoke(...),不走运。
我不知道为什么会这样。使事情变得陌生的是,我能够在同一时间创建的同一类的另一个实例上运行良好(完全没有问题)(在同一调用中从我的数据库返回并一起创建)。我第一个添加评论没有问题,每次都可以,但是我尝试过的所有其他评论都失败了。
答案 0 :(得分:1)
在我的情况下,问题是在任务中刷新了集合视图。然后稍后从Main UI线程添加到集合中导致异常。
在构建视图模型时,会在延迟的任务中刷新集合。
public MainVM()
{
//other code...
Task.Delay(100).ContinueWith(_ => UpdatePreferences());
}
public void UpdatePreferences()
{
//other code..
CollectionViewSource.GetDefaultView(Data.Customers).Refresh();
}
我能够通过调用调度程序来解决问题。
Task.Delay(100).ContinueWith(_ => App.Current.Dispatcher.Invoke(()=> UpdatePreferences()));