WPF DataGrid-Por qué la columna extra


Tengo una aplicación WPF que usa DataGrid para mostrar algunos datos. Cuando corro el programa hay una columna adicional como se muestra aquí: introduzca la descripción de la imagen aquí

Así es como se ve cuando lo diseño en VS2010 introduzca la descripción de la imagen aquí

He desactivado AutoGenerateColumns en la cuadrícula de datos y especificado 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 un MainWindowView que usa inyección para mostrar las vistas como tales (esto es un ventana):

<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 especificado tanto MainWindowView como EmployeeHoursView como Auto Size root ya que quiero que la ventana sea lo suficientemente grande como para acomodar la cuadrícula y el botón. Sin embargo, cuando corro 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 (ancho y alto) que el EmployeeHoursView necesita ser. ¿Cómo puedo codificar esto de tal manera que la ventana de mi aplicación sea lo suficientemente grande para el EmployeeHoursView sin proporcionar valores específicos? ¿Qué está causando que aparezca esta columna adicional?

Author: Dave Clemmer, 2011-12-13

2 answers

La "columna extra" es en realidad solo espacio no utilizado. Cada una de sus columnas define un valor de ancho, por lo que una vez que se les asigna queda espacio.

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

Mi mejor conjetura 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 cosa.

Si no desea que su control se estire, asegúrese de establecer su alineación horizontal/vertical (o la de los padres) en algo que no sea Estirar

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
    <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" />
</StackPanel>
 39
Author: Rachel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-13 18:51:16

Bueno, ya que su espacio no utilizado, otra forma de hacerlo será usar un ancho ponderado en lugar de uno fijo. También puede usar un enfoque híbrido en el que algunos son fijos y otros están ponderados, en ese caso asegúrese de que uno esté 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*" />
 1
Author: amarnath chatterjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-07 04:31:32