WPF 数据网格超级标题
WPF Datagrid Superheader
我正在使用基本的 WPF 数据网格。我需要添加超级标题。每个超级标题都有两列的跨度。此外,这必须动态创建,因为列数是根据数据库中的数据确定的。我让它看起来像这样:SuperHeader。问题是,如果我调整列的大小,超级标题不会按预期移动。下面是代码:
MainWindow.xaml:
<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);
}
}
}
我做错了什么?
我认为 ActualWidth
到 Width
的 GridSplitters
和 Binding
有问题。但是您可以对 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);
将ActalWidth
绑定到MinWidth
和MaxWidth
并设置ColumnDefinition Width="Auto"
。这在我的示例中有效。
我正在使用基本的 WPF 数据网格。我需要添加超级标题。每个超级标题都有两列的跨度。此外,这必须动态创建,因为列数是根据数据库中的数据确定的。我让它看起来像这样:SuperHeader。问题是,如果我调整列的大小,超级标题不会按预期移动。下面是代码: MainWindow.xaml:
<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);
}
}
}
我做错了什么?
我认为 ActualWidth
到 Width
的 GridSplitters
和 Binding
有问题。但是您可以对 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);
将ActalWidth
绑定到MinWidth
和MaxWidth
并设置ColumnDefinition Width="Auto"
。这在我的示例中有效。