2011-12-13 33 views
23

Tengo una aplicación WPF que usa DataGrid para mostrar algunos datos. Cuando ejecuto el programa hay una columna adicional, como se muestra aquí: enter image description hereWPF DataGrid: por qué la columna adicional

Aquí es lo que parece cuando diseño en VS2010 enter image description here

He apagado AutoGenerateColumns en la cuadrícula de datos y especifica las columnas individualmente como tal (esto es un control de usuario):

<Grid Margin="10,10,10,10"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 


    <DataGrid x:Name="EmployeeHours" AutoGenerateColumns="False" ItemsSource="{Binding EmployeeHoursLastWeek}" Width="Auto"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="PerceptionistID" Binding="{Binding PerceptionistID}" Width="100" /> 
      <DataGridTextColumn Header="Week Of" Binding="{Binding WeekOf, StringFormat={}{0:MM/dd/yyyy}}" Width="75" /> 
      <DataGridTextColumn Header="Regular Hours" Binding="{Binding WorkHours}" Width="100" /> 
      <DataGridTextColumn Header="PTO Hours" Binding="{Binding PTOHours}" Width="100" /> 
      <DataGridTextColumn Header="Holiday Hours" Binding="{Binding HolidayHours}" Width="100" /> 
     </DataGrid.Columns> 
    </DataGrid> 

    <Button x:Name="ImportHoursButton" Content="Import Hours" 
      Command="{Binding ImportHoursCommand}" 
      Height="25" Width="100" Margin="10" 
      VerticalAlignment="Bottom" HorizontalAlignment="Right"     
      Grid.Row="1" /> 
</Grid> 

también tengo una MainWindowView que utiliza la inyección para mostrar los puntos de vista como tal (esto es una ventana normal):

<Window x:Class="Sidekick.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vm="clr-namespace:Sidekick.ViewModel" 
     xmlns:vw="clr-namespace:Sidekick.View" 
     Title="Sidekick"> 

    <!-- Typically done in a resources dictionary -->  
    <Window.Resources> 
     <DataTemplate DataType="{x:Type vm:EmployeeHoursViewModel}"> 
      <vw:EmployeeHoursView /> 
     </DataTemplate> 
    </Window.Resources> 

    <StackPanel> 
     <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" /> 
    </StackPanel> 

</Window> 

En el diseñador He especificados tanto MainWindowView y EmployeeHoursView que Auto raíz tamaño que quiero la ventana para ser lo suficientemente grande como para acomodar la rejilla y el botón. Sin embargo, cuando ejecuto el programa, obtengo una columna adicional en la cuadrícula de datos y hace que la ventana del programa sea aproximadamente el doble de grande (tanto en ancho como en alto) que debe ser EmployeeHoursView. ¿Cómo puedo codificar esto para que la ventana de mi aplicación sea suficientemente grande para EmployeeHoursView sin proporcionar valores específicos? ¿Qué está causando que aparezca esta columna adicional?

Respuesta

38

La "columna adicional" es en realidad el espacio no utilizado. Cada una de sus columnas define un valor de Ancho, por lo que una vez que se asignan, queda espacio.

Si desea deshacerse de ese espacio, al menos una de sus columnas una columna * para que se extienda hasta ocupar espacio disponible.

Mi mejor estimación de por qué se ve normal en Visual Studio es probablemente porque tiene el ancho del diseñador establecido en algo más pequeño que el ancho del tiempo de ejecución. Si fuera más grande, verías lo mismo.

Si no desea que su control para estirar, a continuación, asegúrese de establecer que es (o es de los padres) la alineación horizontal/vertical a algo distinto de estiramiento

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 
    <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" /> 
</StackPanel> 
+0

Pero no es que el punto de Tamaño automático, para ajustar el tamaño de los elementos (la cuadrícula de datos en este caso y la ventana principal por proxy) a lo que se necesita? ¿Dónde más podría entrar en juego un elemento de tamaño? Si cambio el ancho de la última columna a "*", el tamaño general de la ventana sigue siendo el mismo y ahora tengo una columna muy amplia. – BrianKE

+0

@BrianKE Desde el sitio MSDN de Microsoft: 'El comportamiento del tamaño automático implica que el elemento llenará el ancho disponible para él. Sin embargo, tenga en cuenta que los controles específicos suelen proporcionar valores predeterminados en sus estilos predeterminados que deshabilitarán el comportamiento del tamaño automático a menos que se vuelva a habilitar específicamente. Http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement .width.aspx – Rachel

+0

Gracias, eso me ayudó a orientarme hacia SizeToContent en MainWindow. Establecer esto en "WidthAndHeight" ahora dimensiona correctamente la ventana principal en función del tamaño de la cuadrícula de datos. – BrianKE

1

bien desde su espacio no utilizado, de otro modo alrededor se usará un ancho ponderado en lugar de uno fijo. Se puede utilizar un enfoque híbrido, así que otras son fijas y algunas son ponderados, en ese caso garantizar una es ponderado (*) Así que en su código será:

<DataGridTextColumn Header="PerceptionistID" Binding="{Binding PerceptionistID}" Width="4*" /> 
     <DataGridTextColumn Header="Week Of" Binding="{Binding WeekOf, StringFormat={}{0:MM/dd/yyyy}}" Width="3*" /> 
     <DataGridTextColumn Header="Regular Hours" Binding="{Binding WorkHours}" Width="4*" /> 
     <DataGridTextColumn Header="PTO Hours" Binding="{Binding PTOHours}" Width="4*" /> 
     <DataGridTextColumn Header="Holiday Hours" Binding="{Binding HolidayHours}" Width="4*" />