2017-07-28 20 views
1

私は基本的なWPFデータグリッドを使用しています。私はスーパーヘッダーを追加する必要があります。各スーパーヘッダーには2つの列のスパンがあります。また、列の数はデータベースのデータに基づいて決定されるため、動的に作成する必要があります。私はこれのように見えるようにした:SuperHeader。問題は、列のサイズを変更すると、スーパーヘッダーが期待どおりに動いていないことです。 MainWindow.xaml:WPF Datagrid Superheader

<TabItem Header="Tab4"> 
       <StackPanel> 
        <Grid Name="grdSuperHeader"/> 
        <DataGrid Name="grdSample" ScrollViewer.HorizontalScrollBarVisibility="Disabled" AutoGenerateColumns="False"> 
        <DataGrid.Columns> 
          <DataGridTextColumn x:Name="SampleColumn1" Header="Column 1"></DataGridTextColumn> 
          <DataGridTextColumn x:Name="SampleColumn2" Header="Column 2"></DataGridTextColumn> 
          <DataGridTextColumn x:Name="SampleColumn3" Header="Column 3" ></DataGridTextColumn> 
          <DataGridTextColumn x:Name="SampleColumn4" Header="Column 4"></DataGridTextColumn> 
          <DataGridTextColumn x:Name="SampleColumn5" Header="Column 5"></DataGridTextColumn> 
          <DataGridTextColumn x:Name="SampleColumn6" Header="Column 6"></DataGridTextColumn> 
         </DataGrid.Columns> 
        <TextBlock></TextBlock> 
        <TextBlock></TextBlock> 
        <TextBlock></TextBlock> 
        <TextBlock></TextBlock> 
        <TextBlock></TextBlock> 
       </DataGrid> 
       <StackPanel HorizontalAlignment="Left" Orientation="Horizontal"> 
         <TextBlock Width="{Binding ElementName=SampleColumn1,Path=ActualWidth}" Text="Footer1" Margin="5,0,0,0"></TextBlock> 
         <TextBlock Width="{Binding ElementName=SampleColumn2,Path=ActualWidth}" Text="Footer2" Margin="5,0,0,0"></TextBlock> 
         <TextBlock Width="{Binding ElementName=SampleColumn3,Path=ActualWidth}" Text="Footer3" Margin="5,0,0,0"></TextBlock> 
         <TextBlock Width="{Binding ElementName=SampleColumn4,Path=ActualWidth}" Text="Footer4" Margin="5,0,0,0"></TextBlock> 
         <TextBlock Width="{Binding ElementName=SampleColumn5,Path=ActualWidth}" Text="Footer5" Margin="5,0,0,0"></TextBlock> 
         <TextBlock Width="{Binding ElementName=SampleColumn6,Path=ActualWidth}" Text="Footer6" Margin="5,0,0,0"></TextBlock> 
        </StackPanel> 
       </StackPanel> 
      </TabItem> 

Mainwindow.xaml.cs:

private void addSuperHeader() 
{ 
    //Create the columns 
    for (int i= 0;i< grdSample.Columns.Count;i++) 
    { 
     ColumnDefinition col = new ColumnDefinition(); 
     grdSuperHeader.ColumnDefinitions.Add(col); 

     var binding = new Binding("ActualWidth") 
     { 
      ElementName = "SampleColumn" + i.ToString() 
     }; 

     col.SetBinding(ColumnDefinition.WidthProperty, binding); 

     if(i%2==0) 
     { 


      //Add header text 
      TextBlock txtHeader = new TextBlock(); 
      txtHeader.Text = "Cols["+(i+1).ToString()+"-"+(i+2).ToString()+"]"; 
      txtHeader.Foreground = new SolidColorBrush(Colors.Green); 
      txtHeader.HorizontalAlignment = HorizontalAlignment.Center; 
      Grid.SetRow(txtHeader, 0); 
      Grid.SetColumn(txtHeader, i); 
      Grid.SetColumnSpan(txtHeader, 2); 

      grdSuperHeader.Children.Add(txtHeader); 
     } 

    } 

} 

私が間違って何をやっている、以下のコードはありますか?

+0

コードビハインドには、DataGridの列幅の情報がありません。どのようにして列の幅を変更することができますか? –

答えて

1

GridSplittersBindingの問題があると思います。ActualWidthからWidthです。しかし、Bindingには次の回避策を使用できます。

ColumnDefinition col = new ColumnDefinition {Width = GridLength.Auto}; 
    grdSuperHeader.ColumnDefinitions.Add(col); 

    var binding = new Binding("ActualWidth") 
    { 
     ElementName = "SampleColumn" + i.ToString() 
    }; 

    col.SetBinding(ColumnDefinition.MaxWidthProperty, binding); 
    col.SetBinding(ColumnDefinition.MinWidthProperty, binding); 

バインドはActalWidthMinWidthへとMaxWidthColumnDefinition Width="Auto"を設定します。これは私の例で働いた。

+0

ありがとうWPFGermany。あなたが提案した変更は確かに助けになりました。ただし、スーパーヘッダーは意図したとおりに2つの列のスパンを取得していません。 if(i%2 == 0)ブロック内に最初に投稿したコードセグメントを確認してください。 –

+0

投稿されたコードセクションとは無関係な、列スパンの問題も修正されています。 –

+0

ようこそ。私は、幅の同期化とグリッドスプリッタでほぼ同じ問題を抱えていました。この回避策はグリッドで作業し、ユーザーによってサイズ変更された唯一のソリューションでした。 – WPFGermany