跨多个DataGrid的共享DataGridColumn宽度

时间:2011-09-01 22:08:05

标签: wpf .net-4.0 datagrid

我在具有相同列和绑定集的应用程序中创建多个DataGrids。我希望做的是让所有DataGrid适当地响应一个DataGrid中的更改。如果我更改一列的大小,其他DG中的相应列应具有相同的宽度。这与S.O.上的这个问题有些相似。 (WPF share column width between separate grids)除了DataGrids,而不是网格。我希望DataGrids在Grid中有类似于IsSharedSize的属性,但似乎并非如此。

是否有我可以访问的属性,或者某种替代方法,来做我想要完成的事情?在任何人提出这个之前,我不能将它们全部合并到一个DataGrid中,我正在尝试的意味着由于应用程序本身的性质,我无法将所有信息放在一个DataGrid中。

2 个答案:

答案 0 :(得分:4)

在这一方上有点晚了,但我遇到了类似的场景,我需要一个Grid坐在DataGrid下方并共享相同的列间距。你可以使用XAML实现类似于digitguy的答案:

<DataGrid x:Name="dgOne">
    <DataGrid.Columns>
        <DataGridTextColumn Header="One" />
        <DataGridTextColumn Header="Two" />
        <DataGridTextColumn Header="Three" />
        <DataGridTextColumn Header="Four" />
    </DataGrid.Columns>
</DataGrid>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding Columns[0].ActualWidth, ElementName=dgOne}" />
        <ColumnDefinition Width="{Binding Columns[1].ActualWidth, ElementName=dgOne}" />
        <ColumnDefinition Width="{Binding Columns[2].ActualWidth, ElementName=dgOne}" />
        <ColumnDefinition Width="{Binding Columns[3].ActualWidth, ElementName=dgOne}" />
    </Grid.ColumnDefinitions>
    ...
</Grid>

没有理由不能用两个DataGrids做同样的事情。

<DataGrid x:Name="dgOne">
    <DataGrid.Columns>
        <DataGridTextColumn Header="One" />
        <DataGridTextColumn Header="Two" />
        <DataGridTextColumn Header="Three" />
        <DataGridTextColumn Header="Four" />
    </DataGrid.Columns>
</DataGrid>
<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn Header="One" Width="{Binding Columns[0].ActualWidth, ElementName=dgOne}" />
        <DataGridTextColumn Header="Two" Width="{Binding Columns[0].ActualWidth, ElementName=dgOne}" />
        <DataGridTextColumn Header="Three" Width="{Binding Columns[0].ActualWidth, ElementName=dgOne}" />
        <DataGridTextColumn Header="Four" Width="{Binding Columns[0].ActualWidth, ElementName=dgOne}" />
    </DataGrid.Columns>
</DataGrid>

答案 1 :(得分:3)

虽然在DataGrid's开箱即用的情况下无法共享宽度,但我认为这是处理此类方案的最佳方式。

在源DataGrid列和目标DataGrid列宽度之间创建绑定。在我的情况下,我有两个目标DataGrid's(dgTarget1和dgTarget2),所以这里是代码:

for (int index = 0; index < dgSource.Columns.Count; index++)
{
    Binding bindingWidth = new Binding();
    bindingWidth.Mode = BindingMode.TwoWay;
    bindingWidth.Source = dgSource.Columns[index];
    bindingWidth.Path = new PropertyPath(DataGridColumn.WidthProperty);
    BindingOperations.SetBinding(dgTarget1.Columns[index], DataGridColumn.WidthProperty, bindingWidth);
    BindingOperations.SetBinding(dgTarget2.Columns[index], DataGridColumn.WidthProperty, bindingWidth);
}