2009-05-27 8 views
4

Dans WPF I ont une grille avec un certain nombre de colonnes définies et la largeur de chaque colonne est liée à la largeur d'une colonne de grille de données, comme suit:Comment lier WPF Grid Column Width dans le code?

<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. 

Quand je lance le programme et redimensionner manuellement les colonnes , Je peux voir le redimensionnement des colonnes de la grille (ShowGridLines = true) et les éléments liés à des colonnes de grille particulières se déplacent de manière appropriée.

Cependant, lorsque j'essaie d'ajouter les colonnes de grille de données et de grille dans le code, je ne peux pas faire fonctionner la liaison (aucune erreur de liaison). Voici un exemple:

binding = new Binding() 
{ 
    Source = dataGrid.Columns[col], 
    Path = new PropertyPath("ActualWidth"), 
    Mode = BindingMode.OneWay, 
}; 

colDef.SetBinding(WidthProperty, binding); 

J'ai essayé d'autres variantes (par exemple ElementName = « DataGridColumn1 », chemin = new PropertyPath (« ActualWidth ») mais se soit pas d'erreur (et non contraignant) ou « ne peut pas trouver la source . d'erreur de liaison » ou une erreur de chemin de BindingExpression

Il doit y avoir un moyen de définir la liaison dans le code ...

Répondre

6

J'ai trouvé la réponse Cette ligne:.

colDef.SetBinding(WidthProperty, binding); 

devrait être remplacé:

colDef.SetBinding(ColumnDefinition.WidthProperty, binding); 
0
DataGridTextColumn textColumn = new DataGridTextColumn(); 
textColumn.Width = DataGridLength.SizeToHeader; 

Google DataGridLength pour obtenir d'autres options ....

0

Dans mon projet, je le fais comme ça - a pensé qu'il était utile de mentionner, puisque j'avais beaucoup de problèmes qui le font fonctionner avant que je l'ai eu:

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 
     }); 
Questions connexes