【问题标题】:Shared DataGridColumn Widths Across Multiple DataGrids跨多个 DataGrid 共享 DataGridColumn 宽度
【发布时间】:2011-11-08 18:41:29
【问题描述】:
我在应用程序中使用相同的列和绑定集创建多个 DataGrid。我希望做的是让所有 DataGrid 对一个 DataGrid 中的更改做出适当的响应。如果我更改一列的大小,其他 DG 中的相应列应该具有相同的宽度。这有点类似于 S.O. 上的这个问题。 (WPF share column width between separate grids) 除了 DataGrids,不是 Grids。我希望 DataGrids 有一个类似于 Grid 中的 IsSharedSize 的属性,但事实并非如此。
是否有我可以访问的属性或其他方法来完成我想要完成的任务?不过,在有人提出这个建议之前,我无法将它们全部合并到一个 DataGrid 中,我正在尝试的意思是,由于应用程序本身的性质,我不能将所有信息放在一个 DataGrid 中。
【问题讨论】:
标签:
wpf
.net-4.0
datagrid
【解决方案1】:
虽然在开箱即用的 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);
}
【解决方案2】:
在这个聚会上有点晚了,但我遇到了一个类似的场景,我需要一个 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>
没有理由不能用两个 DataGrid 做同样的事情。
<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>