最近、Silverlight で datacontext changed イベントの使用に関する問題に遭遇しました。
変更されたイベントをサブスクライブしてからすぐにサブスクライブを解除すると、例外がスローされます。
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
});
}
}
コレクションは、ビジュアル ツリー内のすべての異なるコントロールの子要素であると推測しています。それらの更新はおそらくディスパッチャー キューで行われているのではないかと推測しているので、私の質問は次のとおりです。
イベントが発生した後にサブスクライブ解除されると、その後に変更または更新されるコレクションに影響するのはなぜですか?
編集:これを考えた後、これはイベントハンドラーの呼び出しリストが終了する前に変更されたことと関係がありますか?