Решено - Установка шаблона DataGridColumnHeader с предопределенными столбцами добавляет слишком много столбцов - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть следующая DataGrid:

<DataGrid Grid.Row="2" ItemsSource="{Binding Rejects}" AutoGenerateColumns="False" Style="{StaticResource DataGridStyle}" ColumnHeaderStyle="{StaticResource DataGridHeaderStyle}">
   <DataGrid.Columns>
       <DataGridTextColumn Header="First column" Binding="{Binding Id}"/>
   </DataGrid.Columns>
</DataGrid>

ItemsSource связан со свойством моего ViewModel, называемым Rejects, которое является ObservableCollection объектов Dummy.

Вот стиль, называемый DataGridHeaderStyle:

    <Style x:Key="DataGridHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="Height" Value="30"/>
        <Setter Property="Background" Value="{StaticResource EasternBlueBrush}"/>
        <Setter Property="Foreground" Value="{StaticResource WhiteBrush}"/>
        <Setter Property="BorderBrush" Value="{StaticResource DarkGreyBrush}"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="10 0"/>

        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </Setter.Value>
        </Setter>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridColumnHeader">

                    <ControlTemplate.Resources>
                        <converters:DebugConverter x:Key="DebugConverter"/>
                    </ControlTemplate.Resources>

                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>

                        <Border Background="{TemplateBinding Background}" Padding="5">
                            <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
                                <TextBlock x:Name="SortArrow" Margin="0 0 5 0"/>
                                <ContentPresenter Content="{Binding}"/>
                            </StackPanel>
                        </Border>

                        <Thumb x:Name="PART_RightHeaderGripper" Grid.Column="1"
                               HorizontalAlignment="Right"
                               Width="2"
                               BorderThickness="1"
                               BorderBrush="{StaticResource EasternBlueBrush}"
                               Cursor="SizeWE"/>
                    </Grid>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="ToolTip" Value="Click to sort."/>
                            <Setter Property="Background" Value="{StaticResource CuriousBlueBrush}"/>
                        </Trigger>
                        <Trigger Property="SortDirection" Value="Ascending">
                            <Setter TargetName="SortArrow" Property="Visibility" Value="Visible"/>
                            <Setter TargetName="SortArrow" Property="Text" Value="&#8595;"/>
                        </Trigger>
                        <Trigger Property="SortDirection" Value="Descending">
                            <Setter TargetName="SortArrow" Property="Visibility" Value="Visible"/>
                            <Setter TargetName="SortArrow" Property="Text" Value="&#8593;"/>
                        </Trigger>
                        <Trigger Property="SortDirection" Value="{x:Null}">
                            <Setter TargetName="SortArrow" Property="Visibility" Value="Collapsed"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Я ожидал иметь только один столбец с именем «Первый столбец», но вот результат: Результат

Как вы можете видеть, там это другой столбец, называемый именем моей ViewModel, которая появляется. Это не происходит, когда я удаляю свойство Template. Кроме того, хотя этот новый столбец выглядит как другой, он не реагирует при зависании.

РЕДАКТИРОВАТЬ

Как я уже сказал в ответе @ ketan, я смог удалить странный заголовок столбца, установив для DataContext моей DataGrid значение {x: Null} и установив ItemsSource непосредственно из выделенного кода, что показывает, что проблема связана с DataContext DataGrid, но мне все еще нужно сохранить его Любая идея?

Кроме того, вот список, который я использую в качестве ItemsSource:

public ObservableCollection<Dummy> Rejects { get; set; } = new ObservableCollection<Dummy>()
        {
            new Dummy()
            {
                Id = 1,
                Prop1 = "A"
            },
            new Dummy()
            {
                Id = 2,
                Prop1 = "B"
            }
        };

РЕШЕНИЕ

Я наконец узнал, что происходит не так , Все это связано со свойством Content моего ContentPresenter внутри шаблона: я устанавливаю свойство Content вместо ContentSource. Таким образом, решение:

<ContentPresenter ContentSource="Header"/>

1 Ответ

0 голосов
/ 25 февраля 2020
<DataGrid Grid.Row="2" x:Name="gridDemo" ItemsSource="{Binding lst}" AutoGenerateColumns="False" Loaded="gridDemo_Loaded_1" >
            <DataGrid.Columns>
                <DataGridTextColumn Width="*" Header="First column" Binding="{Binding id}"/>
            </DataGrid.Columns>
        </DataGrid>

передать ширину колона *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...