如何在代码中绑定WPF网格列宽度?

4
在WPF中,我有一个网格(Grid),其中定义了许多列,并且每个列的宽度都绑定到DataGrid列的宽度,如下所示:
<Grid.ColumnDefinitions>
   <ColumnDefinition Width="{Binding ElementName=dataGrid, Path=RowHeaderWidth}" />
   <ColumnDefinition Width="{Binding ElementName=Column0, Path=ActualWidth}" />
   <ColumnDefinition Width="{Binding ElementName=Column1, Path=ActualWidth}" />
   Etc.

<Controls:DataGrid BorderBrush="White"  ItemsSource="{Binding DataTable}"  
                   Name="datagrid1" Grid.Row="2" RowHeaderWidth="0">

    <Controls:DataGrid.Columns>
    <Controls:DataGridTextColumn  Header="Included"  Width="50" x:Name="Column0" />
    <Controls:DataGridTextColumn  Header="First" Width="100" x:Name="Column1" />
     Etc.

当我运行程序并手动调整列宽时,我可以看到网格列(ShowGridLines = true)调整大小,并且与特定网格列相关的元素会适当移动。
然而,当我尝试在代码中添加数据网格和网格列时,无法使绑定工作(没有绑定错误)。以下是一个例子:
 binding = new Binding()
 {
    Source = dataGrid.Columns[col],
    Path = new PropertyPath("ActualWidth"),
    Mode = BindingMode.OneWay, 
 };

 colDef.SetBinding(WidthProperty, binding);

我尝试了其他变体(例如,ElementName =“DataGridColumn1”,Path = new PropertyPath(“ActualWidth”)),但要么没有错误(也没有绑定),要么出现“无法找到绑定源”的错误或BindingExpression路径错误。

一定有一种方法可以在代码中设置绑定...?

3个回答

6
我找到了答案。这一行代码为:
 colDef.SetBinding(WidthProperty, binding);

应该更改为:

 colDef.SetBinding(ColumnDefinition.WidthProperty, binding);

0
DataGridTextColumn textColumn = new DataGridTextColumn();
textColumn.Width = DataGridLength.SizeToHeader;

使用Google DataGridLength来获取其他选项...


0
在我的项目中,我是这样做的 - 我认为值得一提,因为在我弄清楚之前,我遇到了很多问题:
    DataGridTextColumn c = new DataGridTextColumn
    {
          // Binding to my value (not directly related to the question)
          Binding = new Binding
          {
               Path = new PropertyPath(cd.Title + ".Value"),
               Mode = BindingMode.TwoWay
          }
     };

     // Binding the width 
     BindingOperations.SetBinding(c, DataGridTextColumn.WidthProperty, new Binding
     {
           Source = cd,                        // An INotifying object
           Path = new PropertyPath("Width"),   // A Property of that object
           Mode = BindingMode.TwoWay
      });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接