2012-04-11 4 views
2

내 모델보기에서 코드 발췌. 다시 다른 서비스에서 내 전화 나는 여전히 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"스레드입니다.

+0

이것은 샘플 프로젝트에서 작동합니다. RaisePropertyChanged() 호출을 주석 처리했기 때문입니다. 그러나 Application.Current.Dispatcher.Invoke() 래퍼를 제거하면 따옴표로 묶은 예외가 발생합니다. 따라서 내 직감은 버그가 디스패처 호핑 코드가 아닌 다른 곳에서 발생합니다. – Alan

답변

1

CollectionViewSource에 직접 바인딩하는 동안 동일한 스레드 문제가 발생했습니다. 내 목록 상자를 CollectionView 개체에 바인딩하여 문제를 해결했습니다. 이 당신을 도와

<ListBox x:Name="MessageList" ItemsSource="{Binding MessagesView.View}"> 

희망 : 귀하의 경우

, 당신은 단순히 당신의 목록 상자 선언을 변경해야합니다.

관련 문제