Исправление сортировки заголовка DataGrid в пользовательском заголовке с помощью StackPanel - PullRequest
0 голосов
/ 31 марта 2020

У меня есть DataGrid, заполненный из коллекции ObservableCollection.

                <Style x:Key="DGHdr_2LineNormal" TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Height"                       Value="40" />
                <Setter Property="Margin"                       Value="0,2,0,0" />
                <Setter Property="VerticalAlignment"            Value="Bottom" />
                <Setter Property="VerticalContentAlignment"     Value="Bottom" />
                <Setter Property="HorizontalAlignment"          Value="Stretch" />
                <Setter Property="HorizontalContentAlignment"   Value="Center" />
            </Style>

            ...........................

        <DataGrid Grid.Row="1"
                  AutoGenerateColumns="False"
                  IsReadOnly="True"
                  SelectionMode="Single"
                  SelectionUnit="FullRow"
                  GridLinesVisibility="None"
                  Name="MatipBatapConfigList"               
                  ColumnHeaderStyle="{StaticResource DGHdr_2LineNormal}"
                  ItemsSource="{Binding}">
            ...........................
        </DataGrid>

Некоторые элементы ColumnHeaderStyle являются «нормальными» (1 строка текста):

                <DataGridTextColumn Binding="{Binding Path=CurrentItem.hdrSystemName}"
                        Header="Name">

, но для некоторых я использую StackPanel, чтобы иметь несколько строк, используя Элементы TextBox, изменяя размер шрифта между ними:

            <Style x:Key="DGHdr_2LineStackPanel" TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="Width"                        Value="Auto" />
                <Setter Property="Height"                       Value="40" />
                <Setter Property="Margin"                       Value="0,0,0,-2" />
                <Setter Property="HorizontalAlignment"          Value="Stretch" />
                <Setter Property="HorizontalContentAlignment"   Value="Center" />
            </Style>

            ...........................

                <DataGridTextColumn Binding="{Binding Path=CurrentItem.DestAddr}"
                        HeaderStyle="{StaticResource DGHdr_2LineStackPanel}" >
                    <DataGridTextColumn.Header>
                        <StackPanel Orientation="Vertical" Margin="0,0,0,-2">
                            <TextBox Text="Destination" IsReadOnly="True"
                                     HorizontalAlignment="Center" Margin="0" BorderThickness="0" FontSize="9"
                                     VerticalAlignment="Bottom" Width="Auto" Padding="0" Height="16" Background="Transparent"/>
                            <TextBox Text="Address"  IsReadOnly="True"
                                     HorizontalAlignment="Center" Margin="0" BorderThickness="0"
                                     VerticalAlignment="Bottom" Width="Auto" Padding="0" Height="18" Background="Transparent"/>
                        </StackPanel>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>

Проблема, с которой я столкнулся, заключается в сортировке каждого столбца. В «нормальном» случае я могу щелкнуть в любом месте заголовка столбца, чтобы отсортировать его. В случае StackPanel, однако, есть только тонкая 4-пиксельная область сверху (высота стрелки сортировки), в которой вы можете отсортировать столбец.

Есть ли способ изменить Случаи StackPanel таковы, что он действует как «нормальный» случай, в котором вы можете щелкнуть в любом месте заголовка, чтобы отсортировать его?

1 Ответ

0 голосов
/ 01 апреля 2020

Замените элементы TextBox элементами TextBlock в заголовке или установите для свойства IsHitTestVisible элементов TextBox значение false:

<StackPanel Orientation="Vertical" Margin="0,0,0,-2">
    <TextBox Text="Destination" IsReadOnly="True" IsHitTestVisible="False"
                                HorizontalAlignment="Center" Margin="0" BorderThickness="0" FontSize="9"
                                VerticalAlignment="Bottom" Width="Auto" Padding="0" Height="16" Background="Transparent"/>
    <TextBox Text="Address"  IsReadOnly="True" IsHitTestVisible="False"
                            HorizontalAlignment="Center" Margin="0" BorderThickness="0"
                            VerticalAlignment="Bottom" Width="Auto" Padding="0" Height="18" Background="Transparent"/>
</StackPanel>
...