WPF DataGrid - почему дополнительный столбец - PullRequest
27 голосов
/ 13 декабря 2011

У меня есть приложение WPF, которое использует DataGrid для отображения некоторых данных.Когда я запускаю программу, появляется дополнительный столбец, как показано здесь: enter image description here

Вот как это выглядит, когда я создаю его в VS2010 enter image description here

Я отключил AutoGenerateColumns onсетка данных и заданные столбцы индивидуально как таковые (это пользовательский элемент управления):

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

У меня также есть MainWindowView, который использует инъекцию для отображенияпредставления как таковые (это обычное окно):

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

В конструкторе я указал и MainWindowView, и EmployeeHoursView в качестве корня Auto Size, так как я хочу, чтобы окно было достаточно большим, чтобы вместить сетку и кнопку,Однако, когда я запускаю программу, я получаю дополнительный столбец в сетке данных, и это делает окно программы примерно вдвое большим (как по ширине, так и по высоте), чем требуется EmployeeHoursView.Как я могу кодировать это так, чтобы окно моего приложения было достаточно большим для EmployeeHoursView без предоставления конкретных значений?Что вызывает появление этого дополнительного столбца?

Ответы [ 3 ]

41 голосов
/ 13 декабря 2011

«Дополнительный столбец» - это фактически неиспользуемый пробел. Каждый из ваших столбцов определяет значение ширины, поэтому, как только они будут назначены, остается место.

Если вы хотите избавиться от этого пространства, сделайте хотя бы один из ваших столбцов столбцом *, чтобы он растягивался, чтобы заполнить доступное пространство.

Мое лучшее предположение относительно того, почему он выглядит нормально в Visual Studio, возможно, потому, что для ширины конструктора установлено значение, меньшее ширины среды выполнения. Если бы оно было больше, вы бы увидели то же самое.

Если вы не хотите, чтобы ваш элемент управления растягивался, обязательно установите его (или родительское) выравнивание по горизонтали / вертикали в значение, отличное от Stretch

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
    <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" />
</StackPanel>
1 голос
/ 07 марта 2016

Хорошо, поскольку это неиспользуемое пространство, другим способом будет использование взвешенной ширины, а не фиксированной. Вы также можете использовать гибридный подход, при котором некоторые фиксированы, а некоторые взвешены, в этом случае убедитесь, что один взвешен (*) Так в вашем коде это будет:

<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*" />
0 голосов
/ 11 января 2019

Поместите ColumnWidth = "*" в XAML, и это, безусловно, будет работать.

<DataGrid x:Name="DG_FileShow" ColumnWidth="*" ItemsSource="{Binding}" 
 HorizontalAlignment="Left" VerticalAlignment="Top" Height="345" Width="654" 
 Margin="34,53,0,0" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Names" Binding="{Binding}" />
        </DataGrid.Columns>
 </DataGrid>
...