Как связать ширину столбца сетки WPF в коде? - PullRequest
4 голосов
/ 28 мая 2009

В 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 голосов
/ 28 мая 2009

Я нашел ответ. Эта строка:

 colDef.SetBinding(WidthProperty, binding);

следует изменить на:

 colDef.SetBinding(ColumnDefinition.WidthProperty, binding);
0 голосов
/ 15 октября 2015

В моем проекте мне это нравится - подумал, что стоит упомянуть, поскольку у меня было много проблем с тем, чтобы он заработал до того, как я его получил:

    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
      });
0 голосов
/ 21 ноября 2011
DataGridTextColumn textColumn = new DataGridTextColumn();
textColumn.Width = DataGridLength.SizeToHeader;

Google DataGridLength, чтобы получить другие варианты ....

...