You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码将一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:06