如何通过代码将一个DataGridColumn的宽度绑定到另一个DataGridColumn?
问题:如何在代码中将DataGrid列的宽度双向绑定到另一个DataGrid的对应列?
我尝试通过C#代码将一个DataGrid中某列的宽度绑定到另一个DataGrid的对应列宽度,但没能成功实现。以下是我的代码:
DataGridTextColumn classNameColumn = new DataGridTextColumn(); classNameColumn.Header = "CLASS"; classNameColumn.Binding = new Binding("CLASS_NAME"); classNameColumn.IsReadOnly = true; ScheduleGrid.Columns.Add(classNameColumn); DataGridTextColumn noneColumn = new DataGridTextColumn(); noneColumn.Header = ""; var bindingWidth = new Binding("Width") { Source = classNameColumn, Mode = BindingMode.TwoWay }; BindingOperations.SetBinding(noneColumn, WidthProperty, bindingWidth); WeeekHeaderGrid.Columns.Add(noneColumn);
但同样的逻辑在XAML中可以正常运行:
<Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <DataGrid x:Name="ScheduleGrid" Grid.Row="1" AutoGenerateColumns="False" SelectionMode="Single" CanUserReorderColumns="False" CanUserAddRows="False" CanUserSortColumns="False" CellEditEnding="ScheduleGrid_CellEditEnding"> <DataGrid.Columns> <DataGridTextColumn x:Name="ClassName" Header="CLASS" Binding="{Binding CLASS_NAME}" /> </DataGrid.Columns> </DataGrid> <DataGrid x:Name="WeeekHeaderGrid" Grid.Row="0" CanUserReorderColumns="False" CanUserAddRows="False" CanUserSortColumns="False" CanUserResizeColumns="True"> <DataGrid.Columns> <DataGridTextColumn Header="" Width="{Binding Source={x:Reference ClassName}, Path=Width, Mode=TwoWay}"/> </DataGrid.Columns> </DataGrid> </Grid>
请问该如何通过C#代码实现这一功能?
解决方案
问题出在你绑定的依赖属性指定错误——DataGridColumn的宽度属性对应的静态依赖字段是DataGridColumn.WidthProperty,你直接写WidthProperty的话,编译器会解析成当前上下文类的同名属性(如果存在),而非DataGridColumn的目标属性,这就导致绑定根本没关联到正确的字段上。
修改后的代码如下,只需要修正绑定的依赖属性参数即可:
DataGridTextColumn classNameColumn = new DataGridTextColumn(); classNameColumn.Header = "CLASS"; classNameColumn.Binding = new Binding("CLASS_NAME"); classNameColumn.IsReadOnly = true; ScheduleGrid.Columns.Add(classNameColumn); DataGridTextColumn noneColumn = new DataGridTextColumn(); noneColumn.Header = ""; var bindingWidth = new Binding("Width") { Source = classNameColumn, Mode = BindingMode.TwoWay }; // 明确指定DataGridColumn的Width依赖属性 BindingOperations.SetBinding(noneColumn, DataGridColumn.WidthProperty, bindingWidth); WeeekHeaderGrid.Columns.Add(noneColumn);
为什么XAML里能正常工作?因为XAML解析器会根据元素类型(DataGridTextColumn)自动匹配对应的Width依赖属性,不需要手动指定静态字段;但在C#代码中,BindingOperations.SetBinding需要你精准传递目标依赖属性的标识符,否则绑定会静默失效。
另外,双向绑定已经能覆盖用户拖拽调整列宽的同步场景——只要其中一列的宽度发生变化,双向绑定会自动把值同步到另一列上,这个逻辑和你XAML中的效果完全一致。
内容的提问来源于stack exchange,提问作者Nineor
相关产品推荐
相关产品推荐

