¿Cómo hago para que XAML DataGridColumns llene todo el DataGrid?

117

Estoy usando DataGrids en XAML (no Silverlight) con columnas de tamaño variable, el DataGrid se expandirá si el usuario cambia el tamaño de la pantalla.

Actualmente, si el ancho de todas las columnas de DataGrid es menor que el ancho de DataGrid, aparece una "columna" adicional que no se puede hacer clic y no tiene ningún propósito.

¿Alguien sabe cómo hacer que una columna siempre cambie de tamaño para llenar todo el espacio restante?

Pez de oro morado
fuente

Respuestas:

248

Si usa Width="*"la columna se llenará para expandir el espacio disponible.

Si desea que todas las columnas dividan la cuadrícula por igual, aplique esto a todas las columnas. Si solo desea que uno llene el espacio restante, aplíquelo a esa columna y el resto es "Auto" o un ancho específico.

También puede usar Width="0.25*"(por ejemplo) si desea que la columna ocupe 1/4 del ancho disponible.

ChrisF
fuente
2
y cómo hacer algo similar si estoy usando AutoGenerateColumns="True"?
Java potenciado el
1
@javapowered: te sugiero que hagas tu propia pregunta, haciendo referencia a esta.
ChrisF
16
@javapowered<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
Xavier
11
@MohamedSakherSawan, de hecho funciona para datagrid. Tanto ColumnWidth="*"en DataGrid como Width="*"en las columnas individuales tienen el efecto deseado
Steve
1
Da un error Sting no se puede convertir a '*'
co2f2e
18

Asegúrese de que su DataGrid se haya Widthconfigurado en algo como {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

Así, su configuración de Width="*"atributo en DataGrid.Columns/DataGridXXXXColumnelementos debería funcionar.

MStack
fuente
9

Como se señaló, ColumnWidth="*"funcionó perfectamente bien para un DataGrid en XAML.

Lo usé en este contexto:

<DataGrid ColumnWidth="*" ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
PeriferiaSilencio
fuente
7

Establezca la Widthpropiedad de las columnas para que tenga un ancho proporcional, como*

devdigital
fuente
3

Mi 2 centavos ->

Muy tarde para la fiesta

DataGrid -> Columna -> Ancho = "*" solo funciona si el contenedor principal de DataGrid tiene un ancho fijo.

ejemplo: puse el DataGrid en Grid -> Columna cuyo ancho = "Auto" luego Width = "*" en DataGrid no funciona, pero si configura Grid -> Column Width = "450" ​​significa fijo, entonces funciona bien

Muhammad Waqas Aziz
fuente
2

Otro giro sobre el mismo tema:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    dataGrid.Width = e.NewSize.Width - (e.NewSize.Width * .1);

    foreach (var column in dataGrid.Columns)
    {
       column.Width = dataGrid.Width / dataGrid.Columns.Count;
    }
 }
Steve
fuente
1

Agregué HorizontalAlignment = "Center" (el valor predeterminado es "Strech") y resolvió mi problema porque hizo que la cuadrícula de datos solo fuera tan ancha como fuera necesario. (Se eliminó la configuración de Ancho de la cuadrícula de datos si tiene una).

ingrese la descripción de la imagen aquí

JBrooks
fuente
Combinado con la respuesta seleccionada y esta me resolvió el problema. Necesitaba eliminar el ancho en el propio Datagrid. Gracias.
Bryan Harrington
0

Esto no expandirá la última columna de la cuadrícula xaml para ocupar el espacio restante si AutoGeneratedColumns="True".

pramod
fuente
He eliminado AutoGenerateColumns, aunque las columnas no están divididas o estiradas en todo el ancho de la cuadrícula / pantalla de datos. Tengo la fila correspondiente de la cuadrícula como "*" y el ancho de las columnas no tiene ningún ancho especificado (ya sea "automático" o "algún valor"). Pero todavía tengo problemas, aquí está el código xaml de mi diseño pastie.org/10085815
GK
0

establezca el ancho de UNA columna en cualquier valor, es decir, ancho = "*"

alkk
fuente
0

Para aquellos que buscan una solución alternativa de C #:

Si por alguna razón necesita tener habilitadas las "Columnas autogeneradas", una cosa que puede hacer es especificar el ancho de todas las columnas excepto las que desea que se redimensionen automáticamente ( no ocupará el espacio restante , pero cambiará el tamaño al contenido de la celda ).

Ejemplo (dgShopppingCart es mi DataGrid):

dgShoppingCart.Columns[0].Visibility = Visibility.Hidden; 
dgShoppingCart.Columns[1].Header = "Qty";
dgShoppingCart.Columns[1].Width = 100;
dgShoppingCart.Columns[2].Header = "Product Name"; /*This will be resized to cell content*/
dgShoppingCart.Columns[3].Header = "Price";
dgShoppingCart.Columns[3].Width = 100;
dgShoppingCart.Columns[4].Visibility = Visibility.Hidden; 

Para mí, funciona como una solución porque necesitaba cambiar el tamaño de DataGrid cuando el usuario maximiza la ventana.

Exel Gamboa
fuente