WPF GridView сортировка при нажатии на заголовок столбца - PullRequest
1 голос
/ 09 февраля 2020

Я реализую GridView, который сортирует, нажимая на заголовки столбцов. Я нашел одно из стандартных решений, но оно у меня не сработало.

У меня есть заголовок "P", в то время как содержимое ячеек и заголовок должны быть центрированы (выравнивание). Заголовок имеет метку «P», отличную от привязки «Фото».

<GridViewColumn Width="30" Header="P">

    <GridViewColumn.HeaderContainerStyle>
        <Style TargetType="{x:Type GridViewColumnHeader}">
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
        </Style>
    </GridViewColumn.HeaderContainerStyle>

        <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Photo}" HorizontalAlignment="Center"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>

</GridViewColumn>

Код, управляющий щелчком столбца, приведен ниже (с сайта Mircosoft).

Предполагается, что существует DisplayMemberBinding

var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;

, которого у меня нет, в противном случае заголовок столбца и его содержимое не центрируются.

В противном случае он принимает метку столбца в качестве свойства для сортировки.

var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;

Это также не работает, поскольку моя метка - "P", а свойство - "Фото".

Есть еще идеи?

internal void HandleOverviewColumnHeaderClicked(GridViewColumnHeader headerClicked)
{
    ListSortDirection direction;

    if (headerClicked != null)
    {
        if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
        {
            if (headerClicked != _lastHeaderClicked)
            {
                direction = ListSortDirection.Ascending;
            }
            else
            {
                if (_lastDirection == ListSortDirection.Ascending)
                {
                    direction = ListSortDirection.Descending;
                }
                else
                {
                    direction = ListSortDirection.Ascending;
                }
            }

            var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
            var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;

            Sort(sortBy, direction);

            if (direction == ListSortDirection.Ascending)
            {
                headerClicked.Column.HeaderTemplate = _window.Resources["HeaderTemplateArrowUp"] as DataTemplate;
            }
            else
            {
                headerClicked.Column.HeaderTemplate = _window.Resources["HeaderTemplateArrowDown"] as DataTemplate;
            }

            // Remove arrow from previously sorted header
            if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
            {
                _lastHeaderClicked.Column.HeaderTemplate = null;
            }

            _lastHeaderClicked = headerClicked;
            _lastDirection = direction; 
        }
    }
}

1 Ответ

0 голосов
/ 14 февраля 2020
<GridViewColumn DisplayMemberBinding="{Binding MyData}">
      <GridViewColumnHeader Content="MyHeader" Click="GridViewColumnHeader_Click" />
</GridViewColumn>

и

        GridViewColumnHeader _lastHeaderClicked = null;
        ListSortDirection _lastDirection = ListSortDirection.Ascending;

        private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e)
        {            
            var headerClicked = e.OriginalSource as GridViewColumnHeader;
            ListSortDirection direction;

            if (headerClicked != null)
            {
                if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
                {
                    if (headerClicked != _lastHeaderClicked)
                    {
                        direction = ListSortDirection.Ascending;
                    }
                    else
                    {
                        if (_lastDirection == ListSortDirection.Ascending)
                        {
                            direction = ListSortDirection.Descending;
                        }
                        else
                        {
                            direction = ListSortDirection.Ascending;
                        }
                    }

                    var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
                    var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;

                    Sort(sortBy, direction);

                    if (direction == ListSortDirection.Ascending)
                    {
                        headerClicked.Column.HeaderTemplate =
                          Resources["HeaderTemplateArrowUp"] as DataTemplate;
                    }
                    else
                    {
                        headerClicked.Column.HeaderTemplate =
                          Resources["HeaderTemplateArrowDown"] as DataTemplate;
                    }

                    // Remove arrow from previously sorted header
                    if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
                    {
                        _lastHeaderClicked.Column.HeaderTemplate = null;
                    }

                    _lastHeaderClicked = headerClicked;
                    _lastDirection = direction;
                }
            }
        }

        private void Sort(string sortBy, ListSortDirection direction)
        {
            ICollectionView dataView =
              CollectionViewSource.GetDefaultView(lv.ItemsSource);

            dataView.SortDescriptions.Clear();
            SortDescription sd = new SortDescription(sortBy, direction);
            dataView.SortDescriptions.Add(sd);
            dataView.Refresh();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...