Подтвердить что ты не робот

WPF DataGrid - Почему дополнительный столбец

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

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

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

<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 без предоставления определенных значений? Что вызывает появление этого дополнительного столбца?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

<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*" />

Ответ 3

Поместите 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>