2017-03-31 9 views
0

정적 및 동적 열이있는 표를 만들려고합니다. 동적 열은 ColumnGroups 아래에 있어야합니다. ColumnGroups를 사용하지 않을 때는 모든 것이 정상적으로 작동합니다. 하지만 그룹 중 하나에 동적 열을 할당하려고 할 때RadGridView 동적으로 열 및 ColumnGroups 스레드 문제가 발생합니다.

다른 스레드가이 개체를 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다.

내가 별도의 스레드에서 새 창을 만들

내가 만든 후
Thread newWindowThread=new Thread(new ThreadStart(() => 
     { 
      var instrumentWindow=new InstrumentWindow(); 
      ((InstrumentWindowViewModel)instrumentWindow.DataContext).Initialize(instrument.ToString(),DateTime.Today); 
      instrumentWindow.Show(); 
      System.Windows.Threading.Dispatcher.Run(); 
     })); 

     newWindowThread.SetApartmentState(ApartmentState.STA); 
     newWindowThread.IsBackground = true; 

     newWindowThread.Start(); 

정적 열

this.EventGrid.Columns.Add(new GridViewDataColumn() 
     { 
      Header = "Time", 
      DataMemberBinding = new Binding("Time"), 
      DataType = typeof(DateTime) 
     }); 

그리고 동적 열

기본적으로 생각이

를 만들기위한 책임이 실제로 기능 각 용어에 대해 ColumnGroup을 만들고 해당 그룹 아래에 용어 속성을 표시합니다. 나는이 스레드 예외가 열을 ColumnGroup을 assig 할 때
private void InitDynamicColumns() 
    { 
     var maxTermCount = ((InstrumentWindowViewModel)this.DataContext).Events.Max(x => x.Terms.Length); 
     var termHeaders = new List<string>(); 

     for (int i = 0; i < maxTermCount; i++) 
     { 
      var currentTerm = ((InstrumentWindowViewModel)this.DataContext).Events.First().Terms[i]; 
      var analyzerAmountType = currentTerm.Type == AnalyzerAmountType.Seconds ? "sec" : "ticks"; 
      this.EventGrid.ColumnGroups.Add(new GridViewColumnGroup 
      { 
       Header = currentTerm.Size + " " + analyzerAmountType + " term", 
       Name = currentTerm.Size + analyzerAmountType + "term" 
      }); 

      termHeaders.Add(currentTerm.Size + analyzerAmountType + "term"); 
     } 

     for (int i = 0; i < maxTermCount; i++) 
     { 
      this.EventGrid.Columns.Add(new GridViewDataColumn() 
      { 
       Header = "Property1", 
       DataMemberBinding = new Binding("Terms[" + i + "].Property1"), 
       ColumnGroupName = termHeaders[i] 
      }); 
      this.EventGrid.Columns.Add(new GridViewDataColumn() 
      { 
       Header = "Property2", 
       DataMemberBinding = new Binding("Terms[" + i + "].Property2"), 
        ColumnGroupName = termHeaders[i] 
      }); 
      this.EventGrid.Columns.Add(new GridViewDataColumn() 
      { 
       Header = "Property3", 
       DataMemberBinding = new Binding("Terms[" + i + "].Property3"), 
       ColumnGroupName = termHeaders[i] 
      }); 
     } 

    } 

는 언제 ColumnGroups 모든 것을 사용하지 않는 expected.But로 작동합니다.

도움 주셔서 감사합니다.

답변

1

한 창에서 컨트롤에 열을 표시하기 위해 내면 하나의 스레드와 다른 스레드의 열을 만들 수 없습니다. 당신은 열을 생성하고이되는 것과 동일한 스레드에서 창을 만들어야합니다

Why do UI Controls in WPF have Thread Affinity?

: 그것 때문에 스레드 선호도 작동하지 않기 때문에

그냥 이것에 대해 잊지 일반적으로 메인 (UI) 스레드.

WPF 컨트롤은 원래 만들어진 스레드에서만 액세스 할 수 있습니다.

+0

이유가 있다고 생각하지 마십시오. 나는 ModalWindow 코드의 컨트롤을 사용하여 모든 조작을 수행합니다. 동적 열의 경우 모든 것이 완벽하게 작동합니다. ColumnGroup을 만들고 할당하려고 할 때 실패하기 시작합니다. 그리고 이것은 이상합니다 –

+0

이유가 무엇인지 생각하지 마십시오? 왜 처음부터 백그라운드 스레드에 창을 만듭니 까? 동일한 스레드에서 모든 컨트롤을 만드는 경우 분명히 크로스 스레딩 오류가 발생하지 않습니다. – mm8

+0

메인 창에서 몇 개의 독립적 인 창을 만들어야합니다. 그리고 각 창은 주 창을 차단하지 않는 독립적 인 데이터를 얻게됩니다. –