wpf binding datagrid width datagridcolumn

WPF DataGrid Sync Columna Anchos



binding width (5)

Encontré una solución a este problema y una solución extra genial :-) Puede descargar el kit de herramientas WPF y obtener el código del DataGrid. Una vez que tenga el código, todo lo que tiene que hacer es cambiar la clase DataGridColumn para heredar FrameworkElement en lugar de DependencyObject. Una vez que lo hagas, solo te queda un problema, el DataContext de la columna no se inicializaría, ya que la columna no es parte del árbol lógico, y agregarlo al árbol lógico resolvería esto. Puede hacerlo así: Donde OnColumnInitialization es: private void OnColumnInitialization (object remitente, EventArgs e) {
AddLogicalChild (remitente); } Ahora que es parte del árbol lógico, tiene el mismo contexto de datos y puede usar el enlace en la propiedad Ancho. Si todos están vinculados al mismo ancho, tiene una sincronización completa del ancho de sus columnas. Esto funcionó para mí :-) Gili

Tengo dos WPF Toolkit DataGrids , me gustaría que cuando el usuario cambie el tamaño de la primera columna en la primera, cambie el tamaño de la primera columna en la segunda. Intenté vincular el ancho de DataGridColumn en la segunda grilla con la columna correspondiente de la primera grilla, pero no funciona. Preferiría usar todo xaml, pero también estoy de acuerdo con el uso del código.

<tk:DataGrid Width="100" Height="100"> <tk:DataGrid.Columns> <tk:DataGridTextColumn x:Name="Column1" Width="50"/> </tk:DataGrid.Columns> </tk:DataGrid> <tk:DataGrid Width="100" Height="100"> <tk:DataGrid.Columns> <tk:DataGridTextColumn x:Name="Column1Copy" Width="{Binding Path=ActualWidth, ElementName=Column1}"/> </tk:DataGrid.Columns> </tk:DataGrid>

También intenté vincular a Width lugar de a ActualWidth , pero ninguno de los dos funciona.

Cualquier ayuda es muy apreciada.


Bueno, no creo que sea posible usar XAML directo, pero todavía siento que debería hacerlo porque DataGridColumn deriva de DependencyObject . Sin embargo, encontré la manera de hacerlo programáticamente. No me entusiasma, pero funciona:

DataGridColumn.WidthProperty.AddValueChanged(upperCol, delegate { if (changing) return; changing = true; mainCol.Width = upperCol.Width; changing = false; }); DataGridColumn.WidthProperty.AddValueChanged(mainCol, delegate { if (changing) return; changing = true; upperCol.Width = mainCol.Width; changing = false; }); public static void AddValueChanged(this DependencyProperty property, object sourceObject, EventHandler handler) { DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(property, property.OwnerType); dpd.AddValueChanged(sourceObject, handler); }


Intenté esto:

<tk:DataGrid Width="100" Height="100" x:Name="Grid1" Grid.Column="0"> <tk:DataGrid.Columns> <tk:DataGridTextColumn x:Name="Column1" Width="50"/> </tk:DataGrid.Columns> </tk:DataGrid> <tk:DataGrid Width="100" Height="100" x:Name="Grid2" Grid.Column="1"> <tk:DataGrid.Columns> <tk:DataGridTextColumn x:Name="Column1Copy" Width="{Binding Mode=TwoWay, Path=Columns[0].ActualWidth, ElementName=Grid1}"/> </tk:DataGrid.Columns> </tk:DataGrid>

Sin embargo, parece que DataGridColumn s no se deriva de FrameworkElement sino que deriva de DependencyObject , el enlace de esta manera no está disponible.


Puede usar el método DataGrid LayoutUpdated para manipular otros objetos con respecto al ancho de columna.

private void dataGrid1_LayoutUpdated(object sender, EventArgs e) { for(int i = 0 ; i < dataGrid1.Columns.Count && i < dataGrid2.Columns.Count ; ++i) dataGrid2.Columns[i].Width = dataGrid1.Columns[i].ActualWidth; }


Si desea vincular la propiedad Ancho de columna en XAML, en 2 DataGrid ''s, debe hacer lo siguiente.

En el primer nombre de DataGridTextColumn :

<DataGrid> <DataGrid.Columns> <DataGridTextColumn x:Name="Col1"/> </DataGrid.Columns> </DataGrid>

En el segundo DataGrid agregue un DiscreteObjectKeyFrame apuntando a la columna mencionada anteriormente como un recurso, y use la siguiente propiedad Binding to Width en el DataGridTextColumn que desea "vincular":

<DataGrid> <DataGrid.Resources> <DiscreteObjectKeyFrame x:Key="proxyCol1" Value="{Binding ElementName=Col1}"/> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn Width="{Binding Path=Value.Width, Mode=TwoWay, Source={StaticResource proxyCol1}}"/> </DataGrid.Columns> </DataGrid>