최근에 datacontext changed 이벤트를 사용하여 실버 라이트 문제를 발견했습니다.왜 DataContextChanged를 구독 취소하면 컬렉션이 변경되어 InvalidOperation 예외가 발생합니까?
당신이 변경된 일정에 가입 한 후 즉시이 예외가 발생합니다 취소하는 경우,
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
});
}
}
는 시각적 트리에있는 모든 다른 컨트롤의 자식 요소이며, 나는 내 질문이 그래서 그들의 업데이트 아마 디스 큐에 일어나고 같은데요 :
이벤트가 해지 된 후 구독 취소되는 이유가 이후에 수정되거나 업데이트 될 컬렉션에 영향을주는 이유는 무엇입니까?
EDIT : 이 문제를 생각한 후에이 작업은 완료되기 전에 수정되는 이벤트 처리기 호출 목록과 관련이 있습니까?
예외가있는 메시지가 표시됩니까? – Patrick