내 모델보기에서 코드 발췌. 다시 다른 서비스에서 내 전화 나는 여전히 Messages.Add (메시지) 다음과 같은 예외 메시지가 상에이 예외를 받고 있어요라고동일한 스레드에서 CollectionViewSource.Source의 Dispatcher 업데이트가 잘못된 스레드 예외를 throw합니다.
private ObservableCollection<MessageAbstract> _messages;
/// <summary>
/// Gets the Messages property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public ObservableCollection<MessageAbstract> Messages
{
get
{
return _messages;
}
set
{
if (_messages == value)
{
return;
}
_messages = value;
RaisePropertyChanged(() => Messages);
}
}
private CollectionViewSource _messageView;
public CollectionViewSource MessageView
{
get { return _messageView; }
set
{
if (_messageView == value) return;
_messageView = value;
RaisePropertyChanged(() => MessageView);
}
}
private void MessageArrived(Message message){
Application.Current.Dispatcher.Invoke(DispatcherPriority.Send,
new Action(() =>Messages.Add(message));
}
public ModelView(){
MessageView = new CollectionViewSource{Source = Messages};
}
. "이 유형의 CollectionView는 Dispatcher 스레드와 다른 스레드에서 해당 SourceCollection에 대한 변경을 지원하지 않습니다."
내 견해의 코드 발췌.
<ListBox x:Name="MessageList" ItemsSource="{Binding MessagesView}">
나는 Application.Current.Dispatcher 그래서 지금은 내가보기에 추가 할 수없는 이유에 대해 손실있어 MessageList.Dispatcher과 동일 함을 확인했습니다. 내 주요 목표는 컬렉션보기 필터를 사용하여 메시지 목록을 필터링하는 검색 상자를 사용하는 것입니다.
내가 내 대답은 실수 아래의 대답에 # 2 점과 동일 발견 대답을 얻었다. App Dispatcher에 내 컬렉션의 모든 생성을 캡슐화했습니다.
Application.Current.Dispatcher.Invoke(DispatcherPriority.Send,new Action(
() => { Messages = new ObservableCollection<MessageAbstract>();
MessageView = new CollectionViewSource { Source = Messages };
));
WPF: Accessing bound ObservableCollection fails althouth Dispatcher.BeginInvoke is used
우리는 우리 자신 전에이 문제로 실행했습니다. 문제는 두 가지입니다 :1 - SourceCollection에 대한 변경 사항이 주 스레드에 있는지 확인하십시오.
2- CollectionView의 생성이 주 스레드에도 있었는지 확인하십시오 (다른 스레드에서 생성 된 경우, 이벤트 처리기에 대한 응답으로 말하면 대개>이 경우가 아닙니다). CollectionView는 "its"스레드에 대한 수정을 기대하며 "its"> 스레드는 "UI"스레드입니다.
이것은 샘플 프로젝트에서 작동합니다. RaisePropertyChanged() 호출을 주석 처리했기 때문입니다. 그러나 Application.Current.Dispatcher.Invoke() 래퍼를 제거하면 따옴표로 묶은 예외가 발생합니다. 따라서 내 직감은 버그가 디스패처 호핑 코드가 아닌 다른 곳에서 발생합니다. – Alan