2017-03-31 10 views
0

静的および動的列でグリッドを作成しようとしています。 動的列はColumnGroupsの下にある必要があります。 ColumnGroupsを使用していないときは、すべて正常に機能します。しかし、私はグループのいずれかに動的列を割り当てるときにRadGridView動的にColumnsおよびColumnGroupsスレッドの問題を追加しました

呼び出しスレッドは、別のスレッドがそれを所有しているため、このオブジェクトにアクセスできません。私は静的な列動的な列に

を作成する責任がある

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

そして、実際には関数を作成した後、基本的な考え方がある

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(); 

別のスレッドで新しいウィンドウを作成

各用語に対してColumnGroupを作成し、そのグループの下に用語プロパティを表示します。

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] 
      }); 
     } 

    } 

私は私がこのスレッドの例外を取得ColumnにColumnGroupをassigしようとすると、すべてがexpected.Butとして働くColumnGroupsを使用しないでください。

ありがとうございました。

答えて

1

ウィンドウ内のコントロールに列を表示するためにインデントすると、あるスレッドと別のスレッドの列にはウィンドウを作成できません。あなたが列を作成し、これがされているものと同じスレッド上でウィンドウを作成する必要があります

Why do UI Controls in WPF have Thread Affinity?

:それが原因でスレッド・アフィニティーの動作しないため

はちょうどこのことを忘れます通常はメイン(UI)スレッドです。

WPFコントロールは、元々作成されたスレッドでのみアクセスできます。

+0

理由は考えません。私はModalWindowコードの背後にあるコントロールですべての操作を行います。 ダイナミックな列の場合は、すべてが完璧に機能します.ColumnGroupを作成して割り当てようとすると失敗します。 これは変です –

+0

理由は何も考えていないのですか?なぜ、最初にバックグラウンドスレッドでウィンドウを作成していますか?すべてのコントロールを同じスレッド上に作成すると、明らかにクロススレッドエラーは発生しません。 – mm8

+0

私はメインウィンドウからいくつかの独立したウィンドウを作成する必要があります。 各ウィンドウは、メインウィンドウをブロックしない独立したデータを取得します –

関連する問題