2012-05-03 3 views
0

멀티 스레드를 사용하여 ItemsControl에 항목 (UserControl)을 설정하려고합니다. 내 코드는이멀티 스레드를 사용하여 ItemsControl에 Usercontrol을 추가하는 방법?

System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(SetItemsControl)); 
    thread.Start(); 

    void SetItemsControl() 
    { 
     IDictionary<string, object> list = GetUserControlList(); // this function return list of UserControl 
     this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, 
      new Action(delegate() 
      { 
       mylistcontrol.ItemsSource = list; 

      })); 
    } 

좋아하는 많은 UI 구성 요소이 필요하기 때문에 그것은 내 UserControl을

호출 스레드가 STA를해야 내 초기화 기능에서 나옵니다.

어떻게 해결할 수 있습니까 ??

+0

thread.SetApartmentState (ApartmentState.STA);를 설정할 수 있습니다. 시작하기 전에. 다른 문제가 발생할 지 모르겠다. – Dtex

+0

예. 나는 노력했다. 스레딩 문제가 발생했습니다. 다른 스레드가 스레드를 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다. – ChauGiang

답변

2

올바른 방법은 ItemsControl.ItemsSource에 바인딩 된 모음을 업데이트하는 것입니다. 이 시나리오에서는 다른 스레드에서 시각적 요소를 건드리지 않습니다. 바인딩 된 컬렉션을 업데이트합니다. 업데이트되는 컬렉션은 바인딩을 새로 고치도록 알려주며 데이터가 UI에 오면 UI 스레드에서 이미 발생하므로 괜찮습니다. 컬렉션이 수행 할 수 있도록 INotifyCollectionChanged 인터페이스를 구현해야합니다.

+0

ObservableCollection 을 사용하여 컬렉션을 저장하고 ItemsControl에 바인딩합니다. 그러나 같은 오류가 발생했습니다. – ChauGiang

+0

이 컬렉션을 업데이트하는 코드를 게시하시기 바랍니다. – EvAlex

+0

RootData 클래스를 추가했습니다. 'private ObservableCollection list = 새로운 ObservableCollection (); 공개 무효 AddFriend (목록 _list) { 경우 (_list = NULL!) {위한 는 INT (I = 0; I <_list.Count; 내가 ++) { 에는 list.add (_list [I]); }}} ' 는 SetItemsControl 기능, 난 'this.Dispatcher.BeginInvoke (System.Windows.Threading.DispatcherPriority.Normal, 새로운 액션 (대리인() { rootdata.AddFriend (목록)로 변경 ; })); – ChauGiang

관련 문제