我在具有相同列和绑定集的应用程序中创建多个DataGrids。我希望做的是让所有DataGrid适当地响应一个DataGrid中的更改。如果我更改一列的大小,其他DG中的相应列应具有相同的宽度。这与S.O.上的这个问题有些相似。 (WPF share column width between separate grids)除了DataGrids,而不是网格。我希望DataGrids在Grid中有类似于IsSharedSize的属性,但似乎并非如此。
是否有我可以访问的属性,或者某种替代方法,来做我想要完成的事情?在任何人提出这个之前,我不能将它们全部合并到一个DataGrid中,我正在尝试的意味着由于应用程序本身的性质,我无法将所有信息放在一个DataGrid中。
答案 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);
}