我最近在使用 datacontext changed 事件时偶然发现了 Silverlight 中的一个问题。
如果您订阅了更改的事件,然后立即取消订阅,它将引发异常,
DataContextChanged += MainPage_DataContextChanged;
void MainPage_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var vm = e.NewValue as VM;
if(vm != null)
{
DataContextChange-= MainPage_DataContextChanged;//throws invalidoperationexception for collection modified
}
}
为了解决这个问题,我只是稍后取消订阅该事件,在这种情况下,要求是尽早取消订阅,这样才能正常工作。
DataContextChanged += MainPage_DataContextChanged;
void MainPage_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var vm = e.NewValue as VM;
if(vm != null)
{
//forces item onto the dispatcher queue so anything needing to happen with 'collections' happens first
Dispatcher.BeginInvoke(()=>
{
DataContextChange-= MainPage_DataContextChanged;//throws invalidoperationexception for collection modified
});
}
}
我猜这些集合是可视化树中所有不同控件的子元素,我猜他们的更新可能发生在调度程序队列上,所以我的问题是:
为什么在触发后取消订阅的事件会影响将在此之后修改或更新的集合?
编辑:经过一番思考,这与事件处理程序调用列表在完成之前被修改有什么关系吗?